gpt4 book ai didi

c# - 捕获从异步 lambda 抛出的异常

转载 作者:可可西里 更新时间:2023-11-01 08:23:20 25 4
gpt4 key购买 nike

我正在尝试编写一个方法来尝试执行一个操作,但会吞下引发的任何异常。

我的第一次尝试如下:

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,这是危险的,并且是 should be avoided),您应该使用 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;
});
}

我实际上不建议以这种方式忽略未处理的异常。您至少应该考虑记录异常。

关于c# - 捕获从异步 lambda 抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25304464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com