System.Drawing Out of Memory Exception

我的应用程序图形引擎抛出这些exception。 它们都被空的捕获块消耗掉。 在早期,我发现了一个没有被困的人(我回忆起与笔加宽有关)。 我用try和一个空的catch块包围它。 似乎这些例外对所产生的图纸没有影响。 我已经对此做了一些阅读而没有真正理解或深入了解它。

所以我的问题:

  1. 如果可以安全食用,为什么会抛出这些? 和
  2. 忽视它们是否安全? 我担心每个人都有一些隐藏的效果。 我有内存泄漏,例如我从未找到过。

我已经看到System.Drawing抛出OutOfMemoryExceptions,即使它没有内存不足。 一些GDI +函​​数显然只是返回一个愚蠢的错误代码。

IIRC,如果您尝试使用LinearGradientBrush填充宽度或高度为零的矩形,您将获得OutOfMemoryException。 可能还有其他条件,但这是我们遇到的主要问题。

在这种情况下,不需要try / catch。 只需在绘图代码中添加if语句,如果宽度或高度为零,则不填充矩形。

更新:根据对此答案的评论,如果您尝试加载损坏的图像文件,也会发生此问题 。 为此,你别无选择,只能尝试/捕捉。

您可能会安全地从GDI +中捕获OutOfMemoryExceptions,但请尽量减少try块。 考虑记录exception,以便您可以分析日志并尽可能添加防御性代码。 您不希望掩盖真正的 OutOfMemoryException,但您不希望愚蠢的GDI +错误代码使您的应用程序崩溃。

这是一个非常糟糕的例外: http : //msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx .. 没有足够的内存来继续执行程序

您经常会发现,如果您分配了这么多“简单”操作/分配抛出此消息,应用程序很快就会崩溃。 如果这是一个失败的大规模分配,您可能能够继续。

如果应用程序执行任何重要操作,您应该尝试优雅地关闭它们。

要明确回答您的问题:

  1. 它们被抛出,因此应用程序有机会做出反应/恢复:在许多情况下,某些内存分配(价值10GB的对象)可能会失败,可能是单行应用程序崩溃( int[] x = new int[5368709120];等效)应该真正抛出exception而不是崩溃一切

  2. 应该没有隐藏的效果,但是如果一个分配失败,那么下次你想要一些string或其他有用的对象以一些小的方式分配给应用程序的一般操作:事情可能会变得不稳定。 也就是说,根据环境的不同,您可能随时会遇到此exception。

编辑:阅读此内容的任何人都应该考虑显然GDI +也会出于其他原因抛出此exception。

我尝试了“Joe White”建议的解决方案,就是这样。 它抛出了OutOfMemoryException,因为矩形的宽度和高度都是0.在我的情况下,窗口在发生exception时被最小化。

这是一个例子;

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) Using e ##Add conditions to avoid OutOfMemoryException## If (Not ClientRectangle.Width = 0) And (Not ClientRectangle.Height = 0) Then Using rect As GraphicsPath = New GraphicsPath() rect.AddRectangle(ClientRectangle) Using gb As New PathGradientBrush(rect) gb.WrapMode = WrapMode.Tile gb.SurroundColors = New Color() {GradientColors(1), GradientColors(0), GradientColors(2)} gb.CenterColor = GradientColors(0) gb.SetSigmaBellShape(0.5F) e.Graphics.FillPath(gb, rect) End Using End Using End If End Using End Sub