首页 新闻 会员 周边 捐助

C# 中不 await async 异步方法时的异常捕获问题

1
悬赏园豆:50 [已解决问题] 解决于 2019-10-25 21:57

请问在 .NET Core/C# 中如果调用一个异步方法时不对这个异步方法进行 await ,异步方法在执行过程中如果发生了异常,该异常是否能捕获到?

dudu的主页 dudu | 高人七级 | 园豆:30948
提问于:2019-10-25 14:39
< >
分享
最佳答案
1

从同事那学到一招也是唯一的一招捕获异常方法,在所调用的异步方法中进行 catch ,如果不这样就捕获不到异常

public async Task<IActionResult> Index()
{
    RequestAsync();
    return Ok();
}

private async Task RequestAsync()
{
    try
    {
        var client = _httpClientFactory.CreateClient();
        client.Timeout = TimeSpan.FromMilliseconds(1);
        var response = await client.GetAsync("https://www.cnblogs.com/");                
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "RequestAsync");
    }
}
dudu | 高人七级 |园豆:30948 | 2019-10-25 21:55

今天也遇到这个问题,这个处理太直接了,有点违反原则,异常一般都是往上层调用的方法抛出。这样调用这个RequestAsync 就没办法捕获到了

张林-布莱恩特 | 园豆:108 (初学一级) | 2019-11-04 09:48

@张林-布莱恩特: 如果不想使用这种方式,可以是队列,比如 Coravel 的 IQueue.QueueAsyncTask

dudu | 园豆:30948 (高人七级) | 2019-11-04 11:16

@dudu: Task all = null;
try
{
await (all = Task.WhenAll(
ThrowAfter(1000, new Exception("Ex1")),
ThrowAfter(2000, new Exception("Ex2"))));
}
catch
{
foreach (var ex in all.Exception.InnerExceptions)
{
...
}
}
原文:https://www.cnblogs.com/Hai--D/p/6093427.html
这个最佳答案虽然是解决问题的一种方式,太过于直接暴力了

张林-布莱恩特 | 园豆:108 (初学一级) | 2019-11-04 11:52
其他回答(2)
0

放到Result不就相当于“同步”捕获了。

收获园豆:10
花飘水流兮 | 园豆:13615 (专家六级) | 2019-10-25 15:11
0

try{
tak.run(async()=>{task.delay(1000);throw new exception()})
}catch(exception ex){
//抓不到ex
}
appdomain.unhandledexception+= obj,ex=>{
//异常跑这里
}

收获园豆:40
czd890 | 园豆:14488 (专家六级) | 2019-10-25 15:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册