请看以下代码:
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);
}
}
AggregateException
。这样不就足够你所需要的了吗? - Timasync avoid
,它只适用于事件处理程序。为什么不使用await RecursiveAwaiter()
呢?这将抛出异常。 - Panagiotis Kanavosawait
会抛出实际异常,或者如果抛出多个异常,则抛出AggregateException
。 - Panagiotis Kanavosasync void
不仅适用于事件处理程序。在注释中警告可能是有益的,但是除了事件处理程序之外,还有其他有效的使用情况。而且,TopLevelCaller()
的名称强烈暗示了OP理解这一点,并且正确地使用了async void
。 - user743382void T() { R(); }
和async void T() { await R(); }
在处理来自R
的异常方面有显著的差异,而您的问题特别涉及如何处理这些异常。 - user743382