次のように実装するとします。
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
ではなく処理するだけで済むようにするために、 の作成者は何ができるWebException
でしょうか?