我们都知道我们可以使用异常包装(并在以后需要时捕获它)。 但是,我想要实现(并且优雅地)在调用存储过程之后区分错误类型。
我有p_error
字段,其中存储过程转储其错误。它可能是验证错误(无法避免对DB进行验证),或授权错误(我们在2个位置执行此操作,其中一个是DB)或SQL错误。
简而言之,我需要一个漂亮而优雅的机制来区分抛出异常之前的错误类型。
我想到的两种方法:
在数据库级别有3个错误字段:1表示授权,1表示SQL错误,1表示任何其他错误。这可能会变得毛茸茸。
创建错误结构(枚举?),其中存储错误消息,以后可以与之进行比较。再次,太罗嗦了。如果db中的错误消息改变了......难以维护。
还有其他想法吗?
答案 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);
}
}
由于我无法想象数据库具有所有那么多验证或验证错误代码,因此这应该非常简单和容易。