c# – 检查内部异常的类型
发布时间:2020-12-15 04:14:41 所属栏目:百科 来源:网络整理
导读:在我的代码中,我遇到了一个引发System.Reflection.TargetInvocationException的情况.在一个特定的情况下,我知道我如何处理根异常,但是我想抛出所有其他异常.我可以想到这样做的两种方式,但我不知道哪个更好. 1. try{ //code}catch (System.Reflection.Target
在我的代码中,我遇到了一个引发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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |