首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

展现C#世界之七:异常处理

  清单 7.6 实现多个catch 语句

  1: using System;

  2:

  3: class CatchIT

  4: {

  5: public static void Main()

  6: {

  7: try

  8: {

  9: int nTheZero = 0;

  10: int nResult = 10 / nTheZero;

  11: }

  12: catch(DivideByZeroException divEx)

  13: {

  14: Console.WriteLine("divide by zero occurred!");

  15: }

  16: catch(Exception Ex)

  17: {

  18: Console.WriteLine("some other exception");

  19: }

  20: finally

  21: {

  22: }

  23: }

  24: }

  这个例子的技巧为,它包含了多个catch 语句。第一个捕获了更可能出现的DivideByZeroException异常,而第二个catch语句通过捕获普通异常处理了所有剩下来的异常。

  你肯定总是首先捕获特定的异常,接着是普通的异常。如果你不按这个顺序捕获异常,会发生什么事呢?清单7.7中的代码有说明。

  清单7.7 顺序不适当的 catch 语句

  1: try

  2: {

  3: int nTheZero = 0;

  4: int nResult = 10 / nTheZero;

  5: }

  6: catch(Exception Ex)

  7: {

  8: Console.WriteLine("exception " + Ex.ToString());

  9: }

  10: catch(DivideByZeroException divEx)

  11: {

  12: Console.WriteLine("never going to see that");

  13: }

  编译器将捕获到一个小错误,并类似这样报告该错误:

  wrongcatch.cs(10,9): error CS0160: A previous 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 中的异常没有一个符合你特殊的要求——为什么不创建一个新的异常?在即将要学到小节中,都涉及到这两个话题。

上一页  [1] [2] [3] [4] [5] 下一页

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航