处理非等待任务的异常
Handling exception from non-awaited Task
假设我有一个带有 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(即发即弃),并想做一些其他工作,但我也想知道是否有任何未处理的异常。但是应用程序成功完成,没有任何问题的迹象(只是吞下了异常)。
如何在不等待或不使用 Task.Run(...).Wait() 的情况下处理 MyAwesomeMethod() 的异常?
例如,您可以将后台任务中的代码包装在 try...catch 块中,并在您进入 catch 块时立即引发事件(如果您这样做)。
喜欢
event EventHandler<Exception> exceptionInWorker;
并在任务中做
try
{
//do something
}
catch (Exception e)
{
exceptionInWorker?.Invoke(this, e);
}
您可以在任务完成后查看 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 { }
}
});
您可以像订阅一样订阅 TaskScheduler.UnobservedTaskException 事件,但使用将 UnobservedTaskExceptionEventArgs 作为其第二个参数的处理程序,通过它您可以通过其 Exception 属性 访问未处理的异常并记录所有信息关于它。
So, I just run MyAwesomeMethod (fire-and-forget)... but I also want to know if there any unhandled exceptions. But application finishes successfully without any sign of problem (exception is just swallowed).
那不是 "fire and forget"。 "Fire and forget"字面意思是你不关心任务何时(或是否)完成(或错误)。
How can I handle exception from MyAwesomeMethod(), without awaiting it or using Task.Run(...).Wait()?
无论如何使用await
:
Task.Run(async () => {
try {
await MyAwesomeMethod();
} catch (Exception ex) {
Console.WriteLine(ex);
}
});
假设我有一个带有 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(即发即弃),并想做一些其他工作,但我也想知道是否有任何未处理的异常。但是应用程序成功完成,没有任何问题的迹象(只是吞下了异常)。
如何在不等待或不使用 Task.Run(...).Wait() 的情况下处理 MyAwesomeMethod() 的异常?
例如,您可以将后台任务中的代码包装在 try...catch 块中,并在您进入 catch 块时立即引发事件(如果您这样做)。
喜欢
event EventHandler<Exception> exceptionInWorker;
并在任务中做
try
{
//do something
}
catch (Exception e)
{
exceptionInWorker?.Invoke(this, e);
}
您可以在任务完成后查看 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 { }
}
});
您可以像订阅一样订阅 TaskScheduler.UnobservedTaskException 事件,但使用将 UnobservedTaskExceptionEventArgs 作为其第二个参数的处理程序,通过它您可以通过其 Exception 属性 访问未处理的异常并记录所有信息关于它。
So, I just run MyAwesomeMethod (fire-and-forget)... but I also want to know if there any unhandled exceptions. But application finishes successfully without any sign of problem (exception is just swallowed).
那不是 "fire and forget"。 "Fire and forget"字面意思是你不关心任务何时(或是否)完成(或错误)。
How can I handle exception from MyAwesomeMethod(), without awaiting it or using Task.Run(...).Wait()?
无论如何使用await
:
Task.Run(async () => {
try {
await MyAwesomeMethod();
} catch (Exception ex) {
Console.WriteLine(ex);
}
});