如何捕获仅出现在父消息中的内部异常?
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
}
我个人喜欢这个解决方案:
- 浏览代码并准确地查看您要求的例外类型要容易得多
- 您的 "catch all" 桶中没有很多 if 或 switch 语句。
- 你的捕捉线非常专注于这一特定风格,这意味着你可以将多个它们链接在一个
try
上并按递减的特异性排列它们。
至于你没有出现内部异常的情况 - 好吧,你已经陷入困境了。如果库开发人员没有给你一个真正的 InnerException 对象来处理,你就只能检查字符串 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
属性.
到目前为止我已经想到了这个,
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
}
我个人喜欢这个解决方案:
- 浏览代码并准确地查看您要求的例外类型要容易得多
- 您的 "catch all" 桶中没有很多 if 或 switch 语句。
- 你的捕捉线非常专注于这一特定风格,这意味着你可以将多个它们链接在一个
try
上并按递减的特异性排列它们。
至于你没有出现内部异常的情况 - 好吧,你已经陷入困境了。如果库开发人员没有给你一个真正的 InnerException 对象来处理,你就只能检查字符串 Message 属性.