当我创建一个新项目时,我对未处理的异常会有一个奇怪的行为.这就是我可以重现问题的方法:
1)创建一个新的Windows窗体应用程序(C#,. NET Framework 4,VS2010)
2)将以下代码添加到Form1_Load处理程序:
int vara = 5, varb = 0;
int varc = vara / varb;
int vard = 7;
Run Code Online (Sandbox Code Playgroud)
我希望VS中断并在第二行显示未处理的异常消息.但是,会发生的是第三行只是跳过而没有任何消息,应用程序一直在运行.
我现有的C#项目没有这个问题.所以我想我的新项目是用一些奇怪的默认设置创建的.
有没有人知道我的项目有什么问题?
我试过检查Debug-> Exceptions中的方框.但即使我在try-catch块中处理异常,执行也会中断; 这也不是我想要的.如果我没记错的话,在这个对话框中有一个名为"未处理的异常"的列或者类似的东西,这会让我感到非常兴奋.但在我的项目中只有一列("Thrown").
我正在研究.NET项目,我试图只解析字符串中的数值.例如,
string s = "12ACD";
int t = someparefun(s);
print(t) //t should be 12
Run Code Online (Sandbox Code Playgroud)
有几个假设
是否有任何C#预定义函数来解析字符串中的数值?
阅读此问题后,似乎以下代码应该失败:
private void Form1_Load(object sender, EventArgs e)
{
EventHandler myHandler = null;
myHandler(this, null);
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,它运行得很好(并且什么都不做).该代码的行为与以下内容有何不同?
private void Form1_Load(object sender, EventArgs e)
{
EventHandler myHandler = null;
EventHandler myCopy = myHandler;
if (myCopy != null)
{
myHandler(this, null);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据Lasse V. Karlsen的回答,以这种方式捕捉异常是有效的:
private void Form1_Load(object sender, EventArgs e)
{
try
{
EventHandler myHandler = null;
myHandler(this, null);
}
catch (Exception ex)
{
this.Text = "Exception!";
}
}
Run Code Online (Sandbox Code Playgroud) 我的vs调试器有一个奇怪的问题.在vs调试器下运行我的程序时,调试器不会中断未处理的异常.而是将控制权返回给VS,就像程序正常退出一样.如果我查看输出选项卡,就会在线程终止之前列出第一次机会执行.
我了解如何使用"调试"菜单中的"例外"框.我检查了未处理的异常.如果我检查正在发生的特定执行的第一次机会异常,调试器将停止.
但是,我的理解是,调试器也应该停止任何"Unhandled-Exceptions".它不是为我这样做的.
以下是"输出"选项卡的最后几行:
A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll
The thread 0x60c has exited with code 0 (0x0).
The program '[3588] ALMSSecurityManager.vshost.exe: Managed' has exited with code -532459699 (0xe0434f4d).
Run Code Online (Sandbox Code Playgroud)
我不明白为什么异常会在未处理时被标记为"第一次机会"异常.
我相信0xe0434f4d退出代码是一个通用的COM错误.
有任何想法吗?
地铁.