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

时间:2014-06-25 12:45:24

标签: c# exception task

我尝试从另一个线程中捕获异常,但不能。

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和方法,但没有任何反应。 请告诉我如何知道异常抛出?

也许你可以给我看一些示例代码。

4 个答案:

答案 0 :(得分:1)

您的代码可能不会引发异常,因为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

答案 1 :(得分:0)

  

TaskContinuationOptions枚举的OnlyOnFaulted成员   表示只有在执行时才执行继续   先前的任务引发了异常。

task.ContinueWith((Sender) =>
    {
        ////This will be called when error occures
        Sender.Result
    }, TaskContinuationOptions.OnlyOnFaulted);

答案 2 :(得分:0)

你的尝试/捕获不会起作用。出于一个原因:因为在抛出异常之前你很可能已经离开了try块,因为Task在另一个线程上完成。

使用Task,有两种方法可以获得异常。

第一个是在try块中使用task.Wait();。此方法将重新抛出任务抛出的任何异常。 然后,将在catch块中的调用线程上处理任何异常。

第二个是使用ContinueWith方法。这不会阻止你的调用线程。

task.ContinueWith(t => 
{
    // Here is your exception :
    DoSomethingWithYour(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);

答案 3 :(得分:-1)

请注意,以下将阻止使用Wait后的主线程。

try
{
    Task task = Task.Factory.StartNew(Work);
    task.Wait();
}
catch (AggregateException ex)
{
    Console.WriteLine(ex.ToString());
}