假设我有以下控制台应用程序:
Thread thread = new Thread(new ThreadStart(() => { throw new Exception(); }));
thread.IsBackground = true;
thread.Start();
while (true)
Console.WriteLine("Hello from main thread");
是否有可能使整个应用程序不会因为背景胎面的异常而崩溃(当然不使用 try..catch)?
假设我有以下控制台应用程序:
Thread thread = new Thread(new ThreadStart(() => { throw new Exception(); }));
thread.IsBackground = true;
thread.Start();
while (true)
Console.WriteLine("Hello from main thread");
是否有可能使整个应用程序不会因为背景胎面的异常而崩溃(当然不使用 try..catch)?
附加未处理的异常处理程序: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 然而,真的,我不喜欢捕捉所有异常的想法。这几乎从来都不是好主意。
你可以使用ThreadPool
线程。
隐藏未经处理的异常并忘记它不是一个好习惯,所以不要这样做。
我不确定您为什么不想使用 try/catch,但这是处理这种情况的最佳方法,在这种情况下,您应该尽可能修复异常,或者至少将其记录下来以供以后查看
即使您可以全局捕获未处理的异常,您也应该知道有些异常您可能能够捕获,但不能处理。StackoverflowException 可能没有留下足够的堆栈空间来处理异常。与 OutOfMemory 相同。大型物体可能没有足够的空间,但也有可能根本没有空间。
因此,您通常编写代码来捕获和处理您可以处理的那些异常(filenotfound、accessviolation 等),并让所有其他异常让您的应用程序崩溃(崩溃比继续处于未定义状态更好)。对于未处理的异常,您唯一可以做的事情是:尝试优雅地关闭您的应用程序(保存一些更改,写入错误日志或其他)并重新抛出异常。