如何在另一个线程中捕获异常

本文关键字:捕获异常 线程 另一个 | 更新日期: 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());
}