如何在另一个线程中捕获异常
本文关键字:捕获异常 线程 另一个 | 更新日期: 2023-09-27 18:10:24
我尝试从另一个线程捕获异常,但不能。
static void Main(string[] args)
{
try
{
Task task = new Task(Work);
task.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
}
public static void Work()
{
throw new NotImplementedException();
}
我也写了try-catch和at方法,但是什么也没发生。请告诉我如何知道异常抛出?
也许你可以给我看一些示例代码
你的代码可能不会引发异常,因为main方法将执行得太快,进程将在你得到异常之前终止
下面是你的代码
static void Main(string[] args)
{
Task task = new Task(Work);
task.Start();
var taskErrorHandler = task.ContinueWith(task1 =>
{
var ex = task1.Exception;
Console.WriteLine(ex.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
//here you should put the readline in order to avoid the fast execution of your main thread
Console.ReadLine();
}
public static void Work()
{
throw new NotImplementedException();
}
试着看看ContinueWith
TaskContinuationOptions枚举的OnlyOnFaulted成员的情况下才执行延续前一个任务抛出异常。
task.ContinueWith((Sender) =>
{
////This will be called when error occures
Sender.Result
}, TaskContinuationOptions.OnlyOnFaulted);
你的try/catch行不通。原因之一是:在抛出异常之前,您很可能已经离开了try块,因为Task是在另一个线程上完成的。
对于Task,有两种方法可以获得异常。
第一个是在try块中使用task.Wait();
。此方法将重新抛出由任务抛出的任何异常。然后,任何异常都将在catch块中的调用线程上处理。
第二个是使用ContinueWith方法。这不会阻塞你的调用线程。
task.ContinueWith(t =>
{
// Here is your exception :
DoSomethingWithYour(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);
注意,由于使用了Wait
,下面的语句将阻塞主线程。
try
{
Task task = Task.Factory.StartNew(Work);
task.Wait();
}
catch (AggregateException ex)
{
Console.WriteLine(ex.ToString());
}