请考虑以下代码:
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);
}
}
答案 0 :(得分:1)
async void TopLevelCaller()
async void几乎总是坏主意。它专为WPF控制事件而设计。这是火灾和遗忘功能,因此您无法捕获TopLevelCaller抛出的异常。它应该工作:
async Task TopLevelCaller() {
try {
await RecursiveAwaiter();
} catch (Exception e)
{
// Something went wrong. Handle appropriately.
}
}