处理来自非等待任务的异常

时间:2017-08-07 17:53:01

标签: c# .net exception-handling task-parallel-library unobserved-exception

假设我有一个带有Main方法的控制台应用程序,如下所示:

public static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += (sender, eventArgs) =>
    {
        Console.WriteLine("App Unobserved");
    };
    TaskScheduler.UnobservedTaskException += (sender, eventArgs) =>
    {
        Console.WriteLine("Task Unobserved");
    };
    Task.Run(async () => await MyAwesomeMethod());
    // other awesome code...
    Console.ReadLine();
}

public static async Task MyAwesomeMethod()
{
    // some useful work
    if (something_went_wrong)
        throw new Exception();
    // other some useful work
}

所以,我只是运行MyAwesomeMethod(即发即忘),并想做其他工作,但我也想知道是否有任何未处理的异常。但是应用程序成功完成而没有任何问题迹象(异常只是被吞下)。

如何处理来自MyAwesomeMethod()的异常,无需等待它或使用Task.Run(...)。Wait()?

4 个答案:

答案 0 :(得分:2)

  

所以,我只是运行MyAwesomeMethod(即发即忘)...但我也想知道是否有任何未处理的异常。但是应用程序成功完成而没有任何问题迹象(异常只是被吞下)。

那不是“火与忘记”。 “火与忘记”字面意思是你不关心任务完成时(或是否)(或错误)。

  

如何在不等待它或使用Task.Run(...)的情况下处理来自MyAwesomeMethod()的异常.Wait()?

无论如何使用await

Task.Run(async () => {
  try {
    await MyAwesomeMethod();
  } catch (Exception ex) {
    Console.WriteLine(ex);
  }
});

答案 1 :(得分:1)

完成任务后,您可以查看status任务。

Task.Run(() => MyAwesomeMethod()).ContinueWith((task) =>
{
    if (task.Status == TaskStatus.RanToCompletion && task.Result != null)
    {

    }
    else
    {
        try
        {
            Logger.LogError(task.Exception.ToString());
            Logger.LogMessage("something_went_wrong");
        }
        catch { }
    }
});

答案 2 :(得分:0)

例如,你可以在try ... catch块中将代码包装在后台任务中,并在进入catch块后立即引发事件(如果你这样做)。

event EventHandler<Exception> exceptionInWorker;

并在任务中

try
{
    //do something
}
catch (Exception e)
{
    exceptionInWorker?.Invoke(this, e);
}

答案 3 :(得分:-2)

您可以像订购TaskScheduler.UnobservedTaskException事件一样订阅,但是使用UnobservedTaskExceptionEventArgs作为其第二个参数的处理程序,通过它可以通过其Exception属性访问未处理的异常并记录有关它的所有信息。