C#异步异常包装
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#异步异常包装,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1758字,纯文字阅读大概需要3分钟。
内容图文
![C#异步异常包装](/upload/InfoBanner/zyjiaocheng/774/3d742966fc854452afe398f8a028503d.jpg)
我一直在使用.NET 4.6.1中的异步调用,我想知道抛出错误的正确方法是来自需要异步方法但实际上是同步的接口的实现者.例如:
public interface ISomeInterface
{
Task ExecuteAsync();
}
public class SomeClass : ISomeInterface
{
public Task ExecuteAsync()
{
return Task.FromException(new Exception());
}
}
我找到了Task.FromException here.
所以这是.NET 4.6仍然似乎建议包装异常.但是我可以写下面的代码:
public class SomeClass : ISomeInterface
{
public Task ExecuteAsync()
{
throw new Exception();
}
}
当我使用try / catch块调用第二个实现时,客户端捕获了Exception,我认为这就是为什么我们首先使用Task.FromException,而且它还包含原始异常的整个调用堆栈(而方法一只有一个堆栈跟踪到等待客户端的操作).那时似乎第二种方法更好,但似乎每个人都使用方法一.由于async的实现发生了变化,现在是方法之一已经过时了,还是我缺少什么?
我还注意到在堆栈跟踪中,异步方法现在不会在调用之间引入任何额外的帧.我假设这只是为了简化读取堆栈跟踪?
解决方法:
what the correct way to throw errors is from an implementer of an interface that expects an asynchronous method but is in fact synchronous.
如您所发现的,您可以直接抛出异常,也可以将异常放在返回的Task上.
请注意,这会在观察到异常的地方发生变化:
var task = obj1.ExecuteAsync();
await task;
如果直接抛出异常,则会在调用ExecuteAsync时抛出异常.如果在返回的任务上放置了异常,则在等待任务时抛出该异常.大多数情况下,在调用方法后立即等待任务,但并非总是如此(例如,在Task.When各种场景中).
使用异步(任务返回)API,返回的任务表示方法的执行.异步实现的API始终在返回的任务上放置任何异常.所以,我想说任务返回API的期望是任务将收到异常.
在boneheaded exceptions的情况下,您可以采用任何一种方式.由于异常表示代码错误,因此引发错误并不重要.例如,LINQ to Objects将始终立即引发骨头异常,而不是在枚举其返回的枚举器时.
但是,对于所有其他类型的异常,它们肯定应该返回返回的Task.就个人而言,我只是将所有异常放在返回的Task上.
内容总结
以上是互联网集市为您收集整理的C#异步异常包装全部内容,希望文章能够帮你解决C#异步异常包装所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。