c# - 异步方法在调用或等待时会抛出异常吗?
问题描述
当我调用异步方法并取回任务时,它会立即抛出还是会等到我等待任务?
换句话说,这段代码会起作用吗?或者我是否也必须将方法调用包装在 try-block 中?
Task task = ThisMethodWillThrow();
try
{
await task;
}
catch (Exception e)
{
Console.WriteLine("oops");
}
解决方案
两者都是可能的。如果该方法实际上是async
(即在声明中使用了 C#关键字),那么 C# 编译器会以这样一种方式包装它,async
使其始终可靠地抛出 .编写一个可以-ed 的方法,因此:如果您不控制被调用的方法 ( ) 并且不能依赖于实现的知识,那么最好包含初始调用以及.await
await
ThisMethodWillThrow
try
await
作为将立即抛出而不是在 中的方法的示例await
:
Task ThisMethodWillThrow() { // note that this is **not** "async", but is awaitable
if (thingsAreBad) throw new SomeException();
return SomeInnerMethod();
}
async Task SomeInnerMethod() { ... }
可能很容易想到“好吧,只需制作所有等待的方法async
,以避免这种情况” - 比如:
async Task ThisMethodWillThrowToo() { // note that this is "async"
if (thingsAreBad) throw new SomeException();
await SomeInnerMethod();
}
但是:在某些情况下,异步机制在“经常同步,有时是异步”的情况下是一个非常可衡量的性能开销 - 因此性能关键的等待代码(例如 IO/网络代码)的常见优化是主动避免async
除非我们知道我们实际上陷入了异步路径。
推荐阅读
- kubernetes - 在 Kubernetes 上的 Grafana 中设置 Prometheus 数据源时出错
- javascript - 未捕获的 ReferenceError:未为 Web 定义 firebase
- html - CSS - 线性渐变背景上的悬停效果
- python - 使用 selenium 使用 css 选择器查找后如何获取项目 url
- windows - 服务器 SSL 认证路径与浏览器认证路径不同
- ssl - wcf 窗口服务。创建 TLS 客户端凭据时发生致命错误。内部错误状态为 10013
- hmacsha1 - OAuth1.0a C 库或 HMAC-SHA1 C 库
- git - 标签的 Jenkins Git 参考存储库路径
- visual-studio-code - vscode 自定义任务问题匹配器找不到匹配正则表达式的文本
- ios - 什么会导致 RevenueCat 在 App Review 期间失败?