我一直在使用.NET 4.6.1中的异步调用,我想知道正确的方式来抛出错误是从一个接口的实现者,期望一个异步方法,但实际上是同步的。例如:C#异步异常包装
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
的实施变更,现在已经接近过时了,还是我缺少某些东西?
我也注意到在堆栈跟踪中,async
方法现在不会在调用之间引入任何附加帧。我假设这只是为了简化堆栈跟踪?
啊哈,明白了!谢谢你澄清斯蒂芬。 – Matt