2009-12-10 41 views
3

我有类似的代码(不是我写的)C#的try/catch恶梦

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

} 

UPDATE一个应用程序 - 这是.NET C#& EnumerateSomeCoolHardwareDevice()使用的SerialPort?

我知道这段代码有多糟糕,但它的工作原理是这样的!

我的问题你:我可以看到它在某处EnumerateSomeCoolHardwareDevice崩溃();但它不会被Catch捕获(...) - 它只是与发送报告对话框一起崩溃!这目前也只发生在发布版本中...是他们为什么我的异常不会被catch(...)捕获的任何原因?

+5

如果您让我们知道您使用的是哪种语言,因为所涉及的运行时系统将对答案产生影响,这可能会有所帮助。 – 2009-12-10 09:36:50

+0

对不起,更新了问题状态C#(.NET) – rudigrobler 2009-12-10 09:51:26

+0

它是*可能* EnumerateSomeCoolHardwareDevice()调用Environment.FailFast(http://msdn.microsoft.com/en-us/library/ms131100.aspx)这是原因。您可能需要将某些内容附加到应用程序日志中,以将数据输出到可用文件中以检查是否属于这种情况。 – RCIX 2009-12-10 09:55:24

回答

8

我的猜测是,你没有得到你的语言/框架的一个异常,而是EnumerateSomeCoolHardwareDevice()做奇怪的事情,仅仅导致操作系统杀死你的进程。请记住,硬件细节是由像Java和.NET这样的框架抽象出来的,因此,无论何时直接使用硬件做某些事情,您可能都依赖于非托管资源......并且无论出现什么问题,都可能会杀死您,无论是否被捕获。

0

EnumerateSomeCoolHardwareDevice()内可能有try..catch。

如果异常被捕获并在那里处理,除非异常再次抛出,否则外部异常不会被命中。

+0

但随后如果异常被捕获那就不是一般炸毁。 .. – RCIX 2009-12-10 09:53:21

0

(假设的Java)两个错误和异常是Throwable子类。例如,如果EnumerateSomeCoolHardwareDevice()中存在断言失败,您将收到错误消息。

2

假设.NET,如果EnumerateSomeCoolHardwareDevice通过PInvoke的使用的Win32方法(访问硬件)和发生错误时,大多数本机方法返回错误代码。如果没有处理该错误代码,并且无论如何都调用了另一个本地方法(可能是调用失败的参数为空),则严重的本机错误(例如内存访问不良或类似情况)可能导致程序崩溃,并且没有例外抛出。

1

如果它只发生在生产机器上,而不是发生在机器上,那么它可能会导致DLL不匹配。仔细检查所有引用的DLL和框架是相同的版本。

其次,如果错误没有被EnumerateSomeCoolHardwareDevice()抛出,那么它将会崩溃应用程序,因为根据我的经验,没有办法让异常返回栈(或者说我对try/catch的理解)这发生在我以前。

最后,微软的错误报告通常允许你检查什么将被发送到MS,这应该让你看到那里的错误发生了,为什么(假设它在其内具有可读信息)。

检查事件查看器,因为错误也应记录在那里,并且通常会提供关于错误的宝贵资料来源,并且通过在列出的错误中挖掘一点,您应该能够追踪错误。

0

我的猜测是发生了堆栈溢出。这个。NET VM简单地关闭遇到堆栈溢出的发布构建过程,不会抛出CLR异常。这个函数内部可能有一个内部的try/catch函数,它以某种方式捕获StackOverflowException,这就是为什么它不会传播到Debug中的代码。

弄清楚发生了什么事情最简单的方法是通过使调试版本,安装调试和指导调试器打破抛出之前任何异常(在Visual Studio中,调试/异常,并勾选“时抛出”为“Common Language Runtime Exceptions”以及可能还有其他问题,在cordbg.exe“catch exception”中)

0

如果它疯狂地崩溃并且正在使用SerialPort对象,那么可能是因为它在某个时候跳到了背景线程和异常发生在这里。 IIRC .DataReceived事件或者您从串口获取信息返回后台线程上的数据。如果在例程中抛出异常,那么整个应用程序将保释。

找到后台线程并对其进行一些异常处理。

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); 
     } 
    } 

如果您运行的应用程序将和好如初,而不是捕捉如您所料除外。

+0

我会把钱放在这个人的错误是由此造成的。 – Quibblesome 2009-12-10 11:00:18

2

你有没有尝试过的属性

总成:RuntimeCompatibility(WrapNonExceptionThrows =真)

这应该换任何non-.Net异常转换成的System.Exception所以它会在你的代码被逮住。

1

如果你在.NET版本1.1使用一个无参数赶上像

catch{ 
... 
} 

块之前到.NET 2.0有可能是不从System.Exception派生本地例外。

还挂钩到应用程序域unhandled exception事件,看看会发生什么。

0

您看到哪些类型的异常以这种方式表现?你有他们的清单吗?

一些例外情况会继续支持调用堆栈,即使它们已被捕获到,例如ThreadAbortException

其他基本上不可处理,例如StackOverflowExceptionExecutionEngineException

如果是这些(或其他一些我可能错过的)之一,那么行为可能与预期相同。如果是其他人,那么更深入了解更多信息将是必要的。