c# – 如何使此异常处理代码符合DRY原则?

前端之家收集整理的这篇文章主要介绍了c# – 如何使此异常处理代码符合DRY原则?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个特殊情况,我需要捕获异常并将对象返回给客户端而不是异常.我不能将异常处理逻辑放在更高的级别,即在try子句中包装Foo.

最好用一些示例代码进行演示.异常处理逻辑掩盖了方法的意图,如果我有很多类似意图的方法,在Foo类中,我发现自己重复了大部分的catch逻辑.

在下面的代码中包含常见异常功能的最佳技术是什么?

public class Foo
{
     public Bar SomeMethodThatCanThrowExcepetion()
     {
          try
          {
              return new Bar().Execute();
          }
          catch(BazException ex)
          {
              WriteLogMessage(ex,Bar.ErrorCode);
              return new Bar() { ErrorMessage = ex.Message,ErrorCode = Bar.ErrorCode;}                  
          }
     }

     public Baz SomeMethodThatCanThrowExcepetion(SomeObject stuff)
     {
          try
          {
              return new Baz(stuff).Execute();
          }
          catch(BazException ex)
          {
              WriteLogMessage(ex,Baz.ErrorCode);
              return new Baz() { ErrorMessage = ex.Message,ErrorCode = Baz.ErrorCode;}                  
          }
     }
 }

解决方法

根据李的评论更新

一种可能性是使用通用辅助方法.像这样的东西:

T TryExecute<T>(Func<T> action,int ErrorCode)
{
    try
    {
        return action();
    }
    catch (Exception ex)
    {
        result = Activator.CreateInstance<T>();
        typeof(T).GetProperty("ErrorMessage").SetValue(result,ex.Message,null);
        typeof(T).GetProperty("ErrorCode").SetValue(result,ErrorCode,null);
        return result;
    }
    return result;
}

如果您可以修改Bar和Baz,那么您可以通过在T上添加一个要求来改进它:

public interface IError
{
    public string ErrorMessage { get; set; }
    public int ErrorCode { get; set; }
}

T TryExecute<T>(Func<T> action,int ErrorCode) where T : IError
{
    try
    {
        return action();
    }
    catch (Exception ex)
    {
        result = Activator.CreateInstance<T>();
        result.ErrorMessage = ex.Message;
        result.ErrorCode = ErrorCode;
        return result;
    }
}

那你就用了:

return TryExecute<Bar>(new Bar().Execute,Bar.ErrorCode);

和:

return TryExecute<Baz>(new Baz(stuff).Execute,Baz.ErrorCode);

这可能是也可能不是您特定设计的过度抽象;细节决定成败.

原文链接:https://www.f2er.com/csharp/100832.html

猜你在找的C#相关文章