1

假设我有以下控制台应用程序:

Thread thread = new Thread(new ThreadStart(() => { throw new Exception(); }));
thread.IsBackground = true;
thread.Start();

while (true)
  Console.WriteLine("Hello from main thread");

是否有可能使整个应用程序不会因为背景胎面的异常而崩溃(当然不使用 try..catch)?

4

4 回答 4

6

附加未处理的异常处理程序:http: //msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

使用全局处理程序实现所需结果的更好方法(好的,使用 try/catch,但只有一次):

    public static void GlobalHandler(ThreadStart threadStartTarget)
    {
        try
        {
            threadStartTarget.Invoke();
        }
        catch (Exception ex)
        {
             //handle exception here
        }
    }

然后开始你的线程:

        Thread thread = new Thread(o => GlobalHandler(ThreadMethod));
        thread.Start();

PS 然而,真的,我不喜欢捕捉所有异常的想法。这几乎从来都不是好主意。

于 2012-11-26T09:26:17.267 回答
0

你可以使用ThreadPool线程。

于 2012-11-26T09:28:08.683 回答
0

隐藏未经处理的异常并忘记它不是一个好习惯,所以不要这样做。

我不确定您为什么不想使用 try/catch,但这是处理这种情况的最佳方法,在这种情况下,您应该尽可能修复异常,或者至少将其记录下来以供以后查看

于 2012-11-26T09:30:11.123 回答
0

即使您可以全局捕获未处理的异常,您也应该知道有些异常您可能能够捕获,但不能处理。StackoverflowException 可能没有留下足够的堆栈空间来处理异常。与 OutOfMemory 相同。大型物体可能没有足够的空间,但也有可能根本没有空间。
因此,您通常编写代码来捕获和处理您可以处理的那些异常(filenotfound、accessviolation 等),并让所有其他异常让您的应用程序崩溃(崩溃比继续处于未定义状态更好)。对于未处理的异常,您唯一可以做的事情是:尝试优雅地关闭您的应用程序(保存一些更改,写入错误日志或其他)并重新抛出异常。

于 2012-11-26T09:39:21.247 回答