📅  最后修改于: 2023-12-03 15:29:48.076000             🧑  作者: Mango
在 C# 中,当线程抛出未处理的异常时,程序可能会崩溃或出现其他问题。本文将介绍如何处理线程中未处理的异常,并提供一些常见的解决方法。
在 C# 中捕获线程异常最简单的方法是使用 try-catch 块,如下所示:
try
{
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
}
catch (Exception ex)
{
Console.WriteLine("Caught exception: " + ex.Message);
}
C# 提供了 AppDomain.UnhandledException
事件,它可以处理未被 catch 的线程异常。当发生未处理的异常时,C# 运行时会调用 AppDomain.UnhandledException
事件处理程序。示例代码如下:
static void Main(string[] args)
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
}
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
Console.WriteLine("MyHandler caught : " + e.Message);
}
如果您的线程没有正确退出,可能会导致未处理的异常。您可以使用 Thread.Join
方法等待线程完全退出,然后再执行其他代码。示例代码如下:
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
t.Join(); // 等待线程执行完毕
在 C# 5 中引入的 Task-based 异步模式可以减少线程异常的发生。如果使用该模式,您可以使用 Task.Exception
属性处理任何未处理的异常。示例代码如下:
async Task DoWorkAsync()
{
// 业务逻辑
throw new Exception("Something went wrong...");
}
try
{
await DoWorkAsync();
}
catch (Exception ex)
{
Console.WriteLine("Caught exception: " + ex.Message);
}
本文介绍了 C# 中如何处理线程中未处理的异常,并提供了一些常见的解决方法。通过使用这些方法,您可以避免因未处理的异常而导致的程序崩溃和其他问题。