CSharp - C# 捕获OutOfMemoryException使调试困难

  显示原文与译文双语对照的内容

在调试程序时,尝试在即时窗口中执行某些操作时,它会在即时窗口中显示一条错误消息,说明:

由于内存异常,函数求值被禁用。

在查看对象的属性时,它还显示了。

试图找出问题的原因之后,我将它的缩小到这个小代码示例:


using System;


using System.Text.RegularExpressions;



namespace ConsoleApplication2


{


 class Program


 {


 static void Main(string[] args)


 {


 try


 {


//outofmemoryexception can be thrown by Image.FromFile("path/that/does/not/exist.png")


//if the path points to a file that is not an image


 throw new OutOfMemoryException();


 }


 catch (OutOfMemoryException ex)


 {


//caught the exception


//so no problem, right?


 }



//Random object to use in immediate window


 Random rand = new Random();



//Also, try hovering over this regex and take a look at its properties.


 var test = new Regex("");



//put a breakpoint here (at the next closing curly brace) and try calling rand.Next() in the immediate window


 }


 }


}



似乎调试器在发生OutOfMemoryException时异常异常,即使它被捕获。

我可以想象一下,没有人想过调试一个具有ipqos的程序是可以能的。 但是 Image.FromFile 在文件不是图像时就抛出了这个错误。

题:

  • 上述代码示例是否给其他人带来了问题?
  • 有人能澄清一下这一点? 为什么会发生这种情况?
  • 最后,我如何才能阻止?
时间: 原作者:

是的,这是预期的行为。

你需要让调试器运行( 在下一行上单步执行或者放置断点,然后单击 F5 ) 以便从该状态恢复。 即使有时它无法帮助和运行,直到你点击堆栈上的它的他功能,通常使调试器再次协作。

注意,并不是唯一的例子- 即时窗口中的换句话说,长运行代码将使调试器成为相同的状态。

更多信息- MSDN 函数求值被禁用。 由于以前的函数计算超时,因此- 函数求值被禁用。

原作者:
...