代码之家  ›  专栏  ›  技术社区  ›  Jimenemex

如何捕获只出现在父级消息上的内部异常?

  •  0
  • Jimenemex  · 技术社区  · 6 年前

    我想抓住 ORA-01013 异常出现在我的代码中,但它在捕获的异常中没有以正确的顺序出现。我们有一个 Trigger 在数据库中,每次 SERVERRROR 在我们的Oracle数据库中发生。这个 触发 是什么导致了这个问题,但我不能修改它。

    例外没有任何 InnerException ,但我要捕获的异常确实出现在 Message 引发的异常。

    这是抛出异常的顺序,但仅限于 ORA-04088 作为异常引发。剩下的只是抛出的异常 .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型 .引发的异常除了 .消息 属性。

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

    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);
        }
    

    这种方法的问题是我不得不处理 任何 OracleException 进入了接球区。我可以加一个 throw; 在我的if's结束时,或者继续将抛出的异常包装在另一个if's中,但是我宁愿只 catch 关于特定类型的异常 上面有我要的信息 .我能做什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   gunr2171    6 年前

    when catch if()

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

    1. try