考虑以下代码:
void TopLevelCaller() {
RecursiveAwaiter();
}
async Task RecursiveAwaiter() {
var result = await ReceiveDataAsync();
FireEvent(result);
RecursiveAwaiter();
}
假设 ReceiveDataAsync
因异常而失败。
是否可以修改代码以在 TopLevelCaller()
中捕获此异常,以便可以在存在 TopLevelCaller()
的类中完成所有错误处理?
让实现者这样处理错误会更好:
void TopLevelCaller() {
try {
RecursiveAwaiter();
} catch (Exception e)
{
// Something went wrong. Handle appropriately.
}
}
比拥有类似的东西:
async Task RecursiveAwaiter() {
try {
var result = await ReceiveDataAsync();
FireEvent(result);
RecursiveAwaiter();
} catch (Exception e) {
FireExceptionEvent(e);
}
}
最佳答案
async void TopLevelCaller()
async void 几乎总是坏主意。它专为 WPF 控件事件而设计。这是即发即忘的功能,因此您将无法捕获 TopLevelCaller 抛出的异常。它应该工作:
async Task TopLevelCaller() {
try {
await RecursiveAwaiter();
} catch (Exception e)
{
// Something went wrong. Handle appropriately.
}
}
关于c# - 使用递归异步/等待的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207790/