[英]Catch exception thrown from an async lambda
我试图编写一个尝试执行操作但吞下任何引发的异常的方法。
我的第一次尝试如下:
public static void SafeExecute(Action actionThatMayThrowException) {
try {
actionThatMayThrowException();
} catch {
// noop
}
}
使用同步操作调用时有效:
SafeExecute(() => {
throw new Exception();
});
但是在使用异步操作调用时失败:
SafeExecute(async () => {
await Task.FromResult(0);
throw new Exception();
});
有可能编写一个处理这两种情况的方法吗?
要正确处理async
委托,您不应该使用Action
(这将导致lambda表达式为async void
,这是危险的并且应该避免 ),您应该使用Func<Task>
来await
它:
public static async Task SafeExecute(Func<Task> asyncActionThatMayThrowException)
{
try
{
await asyncActionThatMayThrowException();
}
catch
{
// noop
}
}
这将解决async
情况,但不是同步情况。 你不能用一种方法做到这两点。 要做到这一点,您需要一个不同的方法,但它仍然可以调用async
来启用重用:
private static readonly Task<object> _completedTask = Task.FromResult<object>(null);
public static void SafeExecute(Action actionThatMayThrowException)
{
SafeExecute(() =>
{
actionThatMayThrowException();
return _completedTask;
});
}
我实际上不建议以这种方式忽视未处理的异常。 您应该考虑至少记录异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.