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

前端之家收集整理的这篇文章主要介绍了c# – 检查内部异常的类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的代码中,我遇到了一个引发System.Reflection.TargetInvocationException的情况.在一个特定的情况下,我知道我如何处理根异常,但是我想抛出所有其他异常.我可以想到这样做的两种方式,但我不知道哪个更好.

1.

  1. try
  2. {
  3. //code
  4. }
  5. catch (System.Reflection.TargetInvocationException ex)
  6. {
  7. if (typeof(ex.InnerException) == typeof(SpecificException))
  8. {
  9. //fix
  10. }
  11. else
  12. {
  13. throw ex.Innerexception;
  14. }
  15. }

2.

  1. try
  2. {
  3. //code
  4. }
  5. catch (System.Reflection.TargetInvocationException ex)
  6. {
  7. try
  8. {
  9. throw ex.InnerException;
  10. }
  11. catch (SpecificException exSpecific)
  12. {
  13. //fix
  14. }
  15. }

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

解决方法

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

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

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

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

  1. try
  2. {
  3. // Do something
  4. }
  5. catch (TargetInvocationException ex)
  6. {
  7. if (ex.InnerException is SpecificException)
  8. {
  9. // Handle SpecificException
  10. }
  11. else if (ex.InnerException is SomeOtherSpecificException)
  12. {
  13. // Handle SomeOtherSpecificException
  14. }
  15. else
  16. {
  17. throw; // Always rethrow exceptions you don't know how to handle.
  18. }
  19. }

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

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

  1. try
  2. {
  3. // Do something
  4. }
  5. catch (TargetInvocationException ex) when (ex.InnerException is SpecificException)
  6. {
  7. // Handle SpecificException
  8. }
  9. catch (TargetInvocationException ex) when (ex.InnerException is SomeOtherSpecificException)
  10. {
  11. // Handle SomeOtherSpecificException
  12. }

猜你在找的C#相关文章