错误处理灵活性

时间:2009-04-07 21:12:00

标签: c# error-handling

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

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

我想到的两种方法:

  1. 在数据库级别有3个错误字段:1表示授权,1表示SQL错误,1表示任何其他错误。这可能会变得毛茸茸。

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

  3. 还有其他想法吗?

1 个答案:

答案 0 :(得分: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);
  }
}

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