gpt4 book ai didi

c# - 重写同步代码以使用 TPL 时如何简化或包装异常

转载 作者:行者123 更新时间:2023-11-30 17:02:41 25 4
gpt4 key购买 nike

给出如下实现:

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 而不是同时处理 IOExceptionWebException?

最佳答案

我做了一个几乎可以做到这一点的扩展方法。用法:

public static Task<string> GetSomeStringAsync()
{
var doSomething = Task.Factory.StartNew(() => "bar");
return doSomething.WrapExceptions(typeof(IOException), typeof(WebException));
}
  1. 您可以只返回原始任务并继续。
  2. 我建议更改 ServiceWrapperException 以容纳多个异常,例如 AggregateException,然后更改第一部分。

方法:

public static Task<TResult> WrapExceptions<TResult>(this Task<TResult> task, params Type[] exceptionTypes)
{
return task.ContinueWith(_ =>
{
if (_.Status == TaskStatus.RanToCompletion) return _.Result;

if (_.Exception.InnerExceptions.Count > 1)
{
throw new AggregateException(_.Exception);
}

var innerException = _.Exception.InnerExceptions[0];
if (exceptionTypes.Contains(innerException.GetType()))
{
throw new ServiceWrapperException("Some Context", innerException);
}

throw _.Exception;
});
}

关于c# - 重写同步代码以使用 TPL 时如何简化或包装异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com