给定一个实现如下:
public class SomeServiceWrapper
{
public string GetSomeString()
{
try
{
//Do Something
}
catch (IOException e)
{
throw new ServiceWrapperException("Some Context", e);
}
catch (WebException e)
{
throw new ServiceWrapperException("Some Context", e);
}
}
}
上面的目的是让消费者GetSomeString
只需要抓到ServiceWrapperException
。
考虑以下使用类似异步行为扩展它的方法:
public Task<string> GetSomeStringAsync()
{
Task<string>.Factory doSomething = ...
return doSomething.ContinueWith(x =>
{
if (x.IsFaulted)
{
if (x.Exception.InnerExceptions.Count() > 1)
{
throw new AggregateException(x.Exception);
}
var firstException = x.Exception.InnerExceptions[0];
if (typeof(firstException) == typeof(IOException)
|| typeof(firstException) == typeof(WebException))
{
throw new ServiceWrapperException("Some Context", firstException);
}
}
return x.Result;
}
}
这种包装异常的同步方法自然不适合异步方法。
作者可以SomeServiceWrapper
做些什么来简化任何消费者的异常处理代码,以便他们只需要处理TradeLoaderException
而不是同时处理IOException
and WebException
?