我如何才能捕获仅在父母的消息中出现的内部异常?

时间:2018-07-05 18:11:29

标签: c# oracle exception-handling ado.net

我正在尝试在我的代码中捕获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我要的文字。我该怎么办?

1 个答案:

答案 0 :(得分:2)

C#6引入了when关键字,用于catch块。这样,您可以指定一个表达式来缩小要捕获的异常的范围,而不是仅按其类型进行过滤并在catch块内编写if()逻辑。

try
{
    ...
}
catch (OracleException ex) when (ex.Message.Contains("ORA-01013"))
{
    // do things with exception
}

我个人喜欢以下解决方案:

  1. 浏览代码并准确查看哪种您要的异常
  2. 要容易得多
  3. 您没有一个包含所有if或switch语句的“全部捕获”存储桶。
  4. 您的主线非常专注于这种特定样式,这意味着您可以将多个样式链接到一个try上,并以降低的特异性对其进行排序。

至于您的情况却没有出现内部异常-嗯,那是您的事。如果库开发人员没有为您提供真正的InnerException对象,则您将不得不检查字符串Message属性。