处理异常的最佳实践,它在catch块中抛出,在一个线程中。 (。净)

时间:2009-07-21 18:48:37

标签: c# .net multithreading exception-handling

您对在线程执行中处理异常有何看法?更具体地说,如果在try-catch子句的catch块中抛出异常怎么办?如果异常未处理,线程会发生什么?

6 个答案:

答案 0 :(得分:8)

我不得不反对仁,或者至少听说他的意思。

只有在您实际处理它们时才处理异常。只有你可以对出了什么问题做些什么,或者添加信息。不要因为你可以处理它们。

try {
    // ..
} catch (Exception ex) {
    Console.WriteLine(ex.Message);
}

以上情况非常糟糕。首先,您不显示整个异常,而只显示消息。其次,你让事情继续下去,而你不知道这个过程处于什么状态。

答案 1 :(得分:7)

您对处理线程执行中的异常有什么看法?

您应该尽可能地处理异常,并在您预期异常时处理异常。 澄清:我完全赞同约翰,你不应该处理各地的例外情况 - 只有你可以对它们做些什么。但是,您永远不应该在线程中处理异常,因为这会导致严重的问题。有一个根异常处理程序,让你的线程正常死亡(在记录问题之后......)

更具体地说,如果线程被抛入try-catch子句的catch块中会怎么样?

您的意思是:如果在catch块中抛出异常怎么办?好吧,然后它被当前的try-catch块无法处理。最好不要在catch块中放置太多处理以尽可能避免这种情况。

如果线程未处理,线程会发生什么?

您的意思是:如果异常未处理,线程会发生什么?它死了。

正如Ben所说:

  

线程中未捕获的异常   触发一个UnhandledException   线程的AppDomain。你可以留意   这些通过添加事件处理程序:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

答案 2 :(得分:4)

线程中未捕获的异常会在线程的AppDomain中触发UnhandledException。您可以通过添加事件处理程序来监视这些:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

答案 3 :(得分:1)

线程中未处理的异常会导致您的进程死亡,并在事件日志中显示无用的消息。

在每个记录(并且可能重新抛出)的线程中都有顶级异常处理程序是一种很好的做法,就像安装appdomain异常处理程序一样,其他响应也是如此。

答案 4 :(得分:0)

如果您认为可以处理异常,则应该抓住它。所有其他无法处理的异常应该冒泡到堆栈的表面,如果没有找到合适的处理程序,将让线程死亡。

你不应该在catch块中编写任何可能引发另一个异常的代码,但如果你需要,你可以在它周围嵌套另一个try catch块。

答案 5 :(得分:0)

.net异常机制从根本上没有提供任何好方法来处理在执行catch块期间发生的异常,或者在执行“finally”块期间,而另一个异常处于挂起状态。正确的处理将要求.net支持一个复合异常类型,它可以被任何组成部分的“catch”块捕获,但是在所有组成部分都被处理之前,它将自动重新向上调用堆栈。不幸的是,.net没有提供任何这样的复合异常类型;虽然可以以获得这种语义的方式定义和使用自定义类型,但使用它们的代码会相当丑陋,并且它们不能很好地与其他代码可能抛出的异常集成。

因此,人们面临一个选择:扼杀新的异常并让旧的异常传播,让新的异常传播并丢失旧异常,或者创建一个只能由知道的代码处理的复合异常对象。寻找它。这些都不是特别令人愉快的选择。哪一个最好将取决于对条件的理解,不同的异常类型代表什么,以及调用代码将对它们做什么。