c# - 使用递归异步/等待的异常处理

标签 c#

考虑以下代码:

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/

相关文章:

c# - .net 中的 PayPal 定期付款

c# - 在.net core 2 web api中添加Logging Middleware,导致响应出现http 307和400错误

c# - 存储有关测试方法的信息的最佳方式

c# - IIS ASP.net 应用程序突然挂起请求

c# WCF最大字符串内容长度配额

c# - 通过 LINQ to XML 解析 Atom 提要

C# 异步 TCP 套接字 : Handling buffer size and huge transfers

c# - C# 中的指数

c# - 由于注释中的 cref 引用,在 C# 应用程序中出现模糊引用错误?

c# - 用于 Mediawiki 标记的开源解析器代码