繁体   English   中英

捕获异步lambda引发的异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM