c# - 重构异常处理

标签 c# exception refactoring

在我的一个类(class)中,我调用了一个存储库,其中有一些错误处理。我想重构错误处理代码,因为它非常重复,唯一真正改变的是消息。

我的代码目前看起来像这样:

public IList<User> GetUser()
{
    try
    {
        return _repository.GetUsers();
    }
    catch (WebException ex)
    {
        ErrorMessages.Add("...");
        _logger.ErrorException("...", ex);
    }
    catch (SoapException ex)
    {
       ErrorMessages.Add("...");
        _logger.ErrorException("...", ex);
    }
    ... etc
}

我可以用调用另一个方法来替换我的 catch block 中的那些行,该方法采用错误消息值和记录器消息值。但是我想我也可以使用 Action<> 参数来执行此操作,但我在使用 Func<> 和 Action<> 方面经验不足,并且我真的看不出使用其中一种方法比使用其中一种方法有什么好处。

我的问题实际上是什么是重构此代码的最佳方式,以及为什么一种方式优于另一种方式(按照我上面的示例)。

感谢您的帮助。

最佳答案

您可以使用 lambda 来帮助解决这个问题。

如果您将通用错误处理程序定义为接受类型为 Action 的参数,那么您可以在错误处理程序中调用该操作。

您无需担心返回值,因为您在调用时编写的 lambda 可以处理这个问题。

例如,您的通用处理程序可能如下所示:

public void AttemptAction(Action action)
{
    try
    {
        action();
    }
    catch (WebException ex)
    {
        ErrorMessages.Add("...");
        _logger.ErrorException("...", ex);
        // Rethrow?
    }
    catch (SoapException ex)
    {
        ErrorMessages.Add("...");
        _logger.ErrorException("...", ex);
        // Rethrow?
    }
}

然后你可以像这样使用它:

public IList<User> GetUser()
{
    IList<User> result = null;

    AttemptAction(() => result = _repository.GetUsers());

    return result;
}

关于c# - 重构异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16648438/

相关文章:

c# - 在 .net core 应用程序中自托管 HTTP(s) 端点而不使用 asp.net?

java - 在不丢失堆栈跟踪的情况下重新抛出 Java 中的异常

javascript - Watir的ready_state方法抛出 "JavaScript error"

javascript - jQuery 建议 : How can I improve this function for scrolling elements into view?

javascript - 重构 jquery 闭包 : How to refactor to nominal function?

javascript - 仅当还不是 Observable 时才转换为 Observable

c# - 在滚动事件处理程序上多次触发事件

c# - 使用 double.Parse 如果 Null 值,则值替换为 0

c# - Console.Read换行符

c++ - out_of_range、range_error 和 over/underflow_error 之间的区别?