【问题标题】:Error Handling flexibility错误处理灵活性
【发布时间】:2009-04-07 21:12:00
【问题描述】:

我们都知道我们可以使用异常包装(并在以后需要时捕获它)。 但是,我想要(并且优雅地)实现的是在调用存储过程之后区分错误的类型。

我有 p_error 字段,其中存储的 proc 转储其错误。可能是验证错误(无法避免对 DB 进行验证)或授权错误(我们在 2 个地方执行此操作,其中一个是 DB)或 SQL 错误。
简而言之,我需要一个漂亮而优雅的机制来在抛出异常之前区分错误的类型。

我想到的两种方法:

  1. 在数据库级别有 3 个错误字段:1 个用于授权,1 个用于 SQL 错误,1 个用于任何其他错误。这可能会让人毛骨悚然。

  2. 创建一个错误结构(枚举?),其中存储错误消息,以后可以进行比较。再次,太罗嗦了。如果 db 中的错误消息更改...难以维护怎么办。

还有其他想法吗?

【问题讨论】:

    标签: c# error-handling


    【解决方案1】:

    我不明白为什么人们一直在做这种 p_error 废话。至少对于 oracle(我也很确定对于 sql server)来说,调用抛出异常的存储过程的结果是一个引发的异常,它包含的信息比这个愚蠢的 p_error 字段可能要多得多。

    同样,我最近的经验只是使用 oracle,但我会为所有存储过程调用(无论如何都是标准做法)编写一个包装器,并在其中执行类似这样的操作

    try {
      RunMyStoredProcedure();
    }
    catch(OracleException e) {
      new OracleExceptionProcessor().HandleException(e);
    }
    //...
    //...
    class OracleExceptionProcessor {
      static List<int> _validationErrorCodes = new List<int> { 123, 456};
      static List<int> _authenticationErrorCodes = new List<int> { 789};
    
      public void HandleException(OracleException ex) {
        if(_validationErrorCodes.Any(c==ex.ErrorCode))
          throw new DatabaseValidationError(ex);
        if(_authenticationErrorCodes.Any(c==ex.ErrorCode))
          throw new DatabaseAuthenticationError(ex);
        throw new DatabaseSQLError(ex);
      }
    }
    

    由于我无法想象数据库有那么多验证或身份验证错误代码,这应该非常简单和容易。

    【讨论】:

    • 谢谢。我会更清楚。有两种类型的错误:被困在应用程序级别和被困在数据库中。我们没有使用 OracleException;实际上我不得不使用一个处理 Oracle 的包装类,它会抛出自己的异常,我会捕捉到。
    • 但是你的想法基本上是使用错误代码来区分错误类型。问题:这些是自定义代码吗?
    • 在数据库中捕获错误我(和许多其他人)认为是非常糟糕的形式。我假设你在SP里面回滚?那应该是调用应用程序的责任。当我必须这样做时,我总是重新抛出异常。如果您可以检索错误代码,您仍然可以使用我的方法
    • 哦,不,我只是编了一些数字,因为我不想查。我相信你能做到这一点;)
    • 是的,我在 SP 内回滚。我不想讨论为什么有些东西不好/好。总是有 100 种方法可以做同样的事情 - 关键是我必须坚持这些情况。
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 2022-01-21
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多