<展现C#> 第七章 异常处理(rainbow 翻译)
catch clause already catches all exceptions of this or a super type (''System.Exception'') 最后,我必须告发CLR异常与SEH相比时的一个缺点(或差别):没有 EXCEPTION_CONTINUE_EXECUTION标识符的等价 物,它在SEH异常过滤器中很有用。基本上,EXCEPTION_CONTINUE_EXECUTION 允许你重新执行负责异常的代码片段。在重 新执行之前,你有机会更改变量等。我个人特别喜欢的技术为,使用访问违例异常,按需要实施内存分配。 7.3 引发异常 当你必须捕获异常时,其他人首先必须首先能够引发异常。而且,不仅其他人能够引发,你也可以负责引发。其相当 简单: throw new ArgumentException("Argument can''t be 5"); 你所需要的是throw 语句和一个适当的异常类。我已经从表7.1提供的清单中选出一个异常给这个例子。 表 7.1 Runtime提供的标准异常 异常类型 描述 Exception 所有异常对象的基类 SystemException 运行时产生的所有错误的基类 IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发 NullReferenceException 当一个空对象被引用时运行时引发 InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发 ArgumentException 所有参数异常的基类 ArgumentNullException 在参数为空(不允许)的情况下,由方法引发 ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发 InteropException 目标在或发生在CLR外面环境中的异常的基类 ComException 包含COM 类的HRESULT信息的异常 SEHException 封装win32 结构异常处理信息的异常 然而,在catch语句的内部,你已经有了随意处置的异常,就不必创建一个新异常。可能在表7.1 中的异常没有一个符 合你特殊的要求——为什么不创建一个新的异常?在即将要学到小节中,都涉及到这两个话题。 7.3.1 重新引发异常 当处于一个catch 语句的内部时,你可能决定引发一个目前正在再度处理的异常,留下进一步的处理给一些外部的 try-catch 语句。该方法的例子如 清单7.8所示。 清单 7.8 重新引发一个异常 1: try 2: { 3: checked 4: { 5: for (;nCurDig <= nComputeTo; nCurDig++) 6: nFactorial *= nCurDig; 7: } 8: } 9: catch (OverflowException oe) 10: { 11: Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo); 12: throw; 13: } 注意,我不必规定所声明的异常变量。尽管它是可选的,但你也可以这样写: throw oe; 现在有时还必须留意这个异常。 7.3.2 创建自己的异常类 尽管建议使用预定义的异常类,但对于实际场合,创建自己的异常类可能会方便。创建自己的异常类,允许你的异常 类的使用者根据该异常类采取不同的手段。 在清单 7.9 中出现的异常类 MyImportantException遵循两个规则:第一,它用Exception结束类名。第二,它实现了 所有三个被推荐的通用结构。你也应该遵守这些规则。 清单 7.9 实现自己的异常类 MyImportantException 1: using System; 2: 3: public class MyImportantException:Exception 4: { 5: public MyImportantException() 6: :base() {} 7: 8: public MyImportantException(string message) 9: :base(message) {} 10: 11: public MyImportantException(string message, Exception inner) 12: :base(message,inner) {} 13: } 14: 15: public class ExceptionTestApp 16: { 17: public static void TestThrow() 18: { 19: throw new MyImportantException(&quo |
查看所有评论
