c# – 检查内部异常的类型

c# – 检查内部异常的类型,第1张

概述在我的代码中,我遇到了一个引发System.Reflection.TargetInvocationException的情况.在一个特定的情况下,我知道我如何处理根异常,但是我想抛出所有其他异常.我可以想到这样做的两种方式,但我不知道哪个更好. 1. try{ //code}catch (System.Reflection.TargetInvocationException ex){ 在我的代码中,我遇到了一个引发System.Reflection.TargetInvocationException的情况.在一个特定的情况下,我知道我如何处理根异常,但是我想抛出所有其他异常.我可以想到这样做的两种方式,但我不知道哪个更好.

1.

try{    //code}catch (System.Reflection.TargetInvocationException ex){    if (typeof(ex.InnerException) == typeof(SpecificException))    {        //fix    }    else    {        throw ex.Innerexception;    }}

2.

try{    //code}catch (System.Reflection.TargetInvocationException ex){    try    {        throw ex.InnerException;    }    catch (SpecificException exSpecific)    {        //fix    }}

我知道一般来说,抛出异常是很慢的,所以我觉得第一种方法可能会更快.或者,有没有更好的方式做到这一点,我没有想到?

解决方法 您提出的每个解决方案都有自己的问题.

第一种方法检查内部异常的类型是否是您期望的类型.这意味着派生类型将不匹配,这可能不是您想要的.

Dan Puzey提到,第二种方法用当前堆栈位置覆盖内部异常的堆栈跟踪.破坏堆栈跟踪可能会破坏您需要的一个引导来修复错误.

解决方案基本上是DarkGray发布的,Nick的建议和我自己的补充建议(在其他):

try {     // Do something} catch (TargetInvocationException ex) {     if (ex.InnerException is SpecificException)     {         // Handle SpecificException    }    else if (ex.InnerException is SomeOtherSpecificException)    {        // Handle SomeOtherSpecificException    }    else     {         throw;    // Always rethrow exceptions you don't kNow how to handle.    } }

如果你想重新抛出一个你不能处理的异常,不要抛出ex;因为这将覆盖堆栈跟踪.而是使用throw它保留堆栈跟踪.它基本上意味着“我实际上不想输入这个catch子句,假装我从来没有抓到这个例外”.更多信息:重新抛出异常.

更新:C#6.0通过异常过滤器提供了更好的语法:

try{    // Do something}catch (TargetInvocationException ex) when (ex.InnerException is SpecificException){    // Handle SpecificException}catch (TargetInvocationException ex) when (ex.InnerException is SomeOtherSpecificException){    // Handle SomeOtherSpecificException}
总结

以上是内存溢出为你收集整理的c# – 检查内部异常的类型全部内容,希望文章能够帮你解决c# – 检查内部异常的类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262480.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存