C# try/catch 噩梦

3

我有一个应用程序,其代码与此类似(不是我编写的)

try
{
    EnumerateSomeCoolHardwareDevice();
}
catch (Exception ex)
{

} 

更新 - 这是.NET C#,而 EnumerateSomeCoolHardwareDevice() 正在使用 SerialPort?

我知道这段代码很糟糕,但它有其原因!

我的问题是:我可以看到它在 EnumerateSomeCoolHardwareDevice(); 中崩溃,但它没有被 catch (...) 捕获 - 它只是崩溃并出现发送报告对话框!目前这种情况仅发生在发布版本中... 是否有任何原因导致我的异常不会被 catch (...) 捕获?


5
请告诉我们您正在使用哪种语言,这可能有助于回答您的问题,因为涉及到的运行时系统会对答案产生影响。 - Timo Geusch
抱歉,已更新问题说明为 C#(.NET)。 - rudigrobler
有可能 EnumerateSomeCoolHardwareDevice() 调用了 Environment.FailFast (http://msdn.microsoft.com/en-us/library/ms131100.aspx) 这个方法,这可能是问题的原因。你可以将一些数据附加到应用程序日志中,以输出到可用文件中进行检查。 - RCIX
串口访问的是什么?它是物理COM端口还是虚拟COM端口? - Alistair Evans
尝试这个: 尝试{ } 捕获(){} // 这应该是非CLS兼容异常 或者捕获(Win32Exception winex){} - PRR
12个回答

0
如果它在疯狂崩溃并且正在使用SerialPort对象,则很可能是因为在某个时刻它跳到了后台线程,并且在此处发生了异常。如果我没记错,.DataReceived事件或者你从串口获取信息的方式会在后台线程上返回数据。如果在这个例程中抛出异常,那么整个应用程序都将退出。
找到后台线程并在其周围放置一些异常处理。

0

你见过哪些异常以这种方式行为?你有它们的列表吗?

有些异常即使在 catch 块中被捕获,也会继续向上调用堆栈传播,例如 ThreadAbortException。

其他一些异常基本上是无法处理的,例如 StackOverflowException 或 ExecutionEngineException。

如果是其中之一(或我可能错过了其他一些异常),那么行为可能是预期的。如果是其他一些异常,则需要更多信息进行深入研究。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接