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

How can I catch an inner exception which is only present on the parent's message?

我试图在我的代码中捕获一个 ORA-01013 异常,但它没有以正确的顺序出现在捕获的异常中。我们在数据库中有一个 Trigger,每当我们的 Oracle 数据库中发生 SERVERRROR 时,它就会触发并记录。这个 Trigger 是导致问题的原因,但我无法修改它。

Exception没有任何InnerException,但我要捕获的异常确实出现在抛出的ExceptionMessage

这是抛出异常的顺序,但只有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 属性.

之外没有 link 到想要的异常

到目前为止我已经想到了这个,

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 对特定类型的异常 我要查找的消息文本。我能做什么?

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

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

我个人喜欢这个解决方案:

  1. 浏览代码并准确地查看您要求的例外类型要容易得多
  2. 您的 "catch all" 桶中没有很多 if 或 switch 语句。
  3. 你的捕捉线非常专注于这一特定风格,这意味着你可以将多个它们链接在一个 try 上并按递减的特异性排列它们。

至于你没有出现内部异常的情况 - 好吧,你已经陷入困境了。如果库开发人员没有给你一个真正的 InnerException 对象来处理,你就只能检查字符串 Message 属性.