我正在尝试在我的代码中捕获ORA-01013
异常,但是在捕获的异常中它没有以正确的顺序出现。我们数据库中有一个Trigger
,每次在我们的Oracle数据库中发生SERVERRROR
时都会触发并记录。这是造成问题的Trigger
,但我无法对其进行修改。
该异常没有任何InnerException
,但是我要捕获的异常确实出现在抛出的异常的Message
中。
这是引发异常的顺序,但是只有ORA-04088
被引发为异常。其余的只是在抛出的异常.Message
属性中,我怀疑它被吞没了。
“引发的异常”的.Message
属性:
ORA-04088: error during execution of trigger 'TRIG_SERVER_ERRORS' // Don't want this
ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 14
ORA-01013: user requested cancel of current operation // Want this
我要捕获的异常是ORA-01013
,但是引发的异常是ORA-04088
。抛出的异常除了.Message
属性以外,没有指向所需异常的链接。
到目前为止,我已经提出了这个建议,
try
{
...
...
}
catch (OracleException ex)
{
// if(ex.Number = 01013) // This doesn't work since ex.Number is 04088
// if(ex.GetBaseException().Number) // Doesn't work also since ORA-04088 is the Base Exception
if (ex.Message.Contains("ORA-01013")) // I want to catch this
{
throw new TimeoutException("The request took too long to complete. Please add more parameters to search by, or reduce the date duration", ex);
}
else
{
throw new DataAccessException(99999, ex, "ORA-{0} exception occurred during the inline call to {1}.", ex.Number.ToString(), MethedInfo.GetCurrentMethod().Name);
}
这种方法的问题是我被迫处理进入catch块的 any OracleException
。我可以在if的末尾添加一个throw;
或继续将抛出的异常包装在另一个异常中,但是我宁愿只对具有消息的异常的特定类型使用catch
我要的文字。我该怎么办?
答案 0 :(得分:2)
C#6引入了when关键字,用于catch
块。这样,您可以指定一个表达式来缩小要捕获的异常的范围,而不是仅按其类型进行过滤并在catch块内编写if()
逻辑。
try
{
...
}
catch (OracleException ex) when (ex.Message.Contains("ORA-01013"))
{
// do things with exception
}
我个人喜欢以下解决方案:
try
上,并以降低的特异性对其进行排序。至于您的情况却没有出现内部异常-嗯,那是您的事。如果库开发人员没有为您提供真正的InnerException对象,则您将不得不检查字符串Message属性。