C#尝试/捕捉噩梦

rud*_*ler 3 c# exception-handling

我有一个类似代码的应用程序(不是我写的)

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

} 
Run Code Online (Sandbox Code Playgroud)

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

我知道这段代码有多糟糕,但它的作用是有原因的!

我的问题:我可以看到它在EnumerateSomeCoolHardwareDevice()中崩溃了; 但它没有被Catch捕获(...) - 它只是与发送报告对话框崩溃了!这也只发生在发布版本中...他们的任何理由为什么我的异常不会被catch(...)捕获?

Joe*_*oey 8

我的猜测是你没有在你的语言/框架中获得异常,而是EnumerateSomeCoolHardwareDevice()做了一些奇怪的事情,只会导致操作系统终止你的进程.请记住,硬件细节是由Java和.NET等框架抽象出来的,所以每当你直接用硬件做事时,你可能都依赖于非托管资源......无论出现什么问题都可以杀死你,抓住或不捕获.


fyj*_*ham 7

一个可能的原因是该EnumerateSomeCoolHardwareDevice()函数使用线程.如果在线程中抛出异常并且未在其线程内处理,那么它可能会使应用程序崩溃.这个简单的应用程序可以证明我的意思:

    public static void testThread()
    {
        throw new Exception("oh god it's broken");
    }

    static void Main(string[] args)
    {
        try
        {
            Thread thread = new Thread(testThread);
            thread.Start();
            Console.ReadKey(); //Just to make sure we don't get out of the try-catch too soon
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果你运行该应用程序将崩溃和刻录,而不是像你期望的那样捕获异常.