首页 | 互联网 | 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.2.2 使用 try 和 finally 清除异常

  如果你更关心清除而不是错误处理, try 和 finally 会获得你的喜欢。它不仅抑制了出错消息,而且所有包含在 finally 块中的代码在异常被引发后仍然会被执行。

  尽管程序不正常终止,但你还可以为用户获取一条消息,如清单 7.4 所示。

  清单 7.4 在finally 语句中处理异常

  1: using System;

  2:

  3: class Factorial

  4: {

  5: public static void Main(string[] args)

  6: {

  7: long nFactorial = 1, nCurDig=1;

  8: long nComputeTo = Int64.Parse(args[0]);

  9: bool bAllFine = false;

  10:

  11: try

  12: {

  13: checked

  14: {

  15: for (;nCurDig <= nComputeTo; nCurDig++)

  16: nFactorial *= nCurDig;

  17: }

  18: bAllFine = true;

  19: }

  20: finally

  21: {

  22: if (!bAllFine)

  23: Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);

  24: else

  25: Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);

  26: }

  27: }

  28: }

  通过检测该代码,你可能会猜到,即使没有引发异常处理,finally也会被执行。这是真的——在finally中的代码总是会被执行的,不管是否具有异常条件。为了举例说明如何在两种情况下提供一些有意义的信息给用户, 我引进了新变量bAllFine.bAllFine告诉finally 语段,它是否是因为一个异常或者仅是因为计算的顺利完成而被调用。

  作为一个习惯了SEH程序员,你可能会想,是否有一个与__leave 语句等价的语句,该语句在C++中很管用。如果你还不了解,在C++中的__leave 语句是用来提前终止 try 语段中的执行代码,并立即跳转到finally 语段 .

  坏消息, C# 中没有__leave 语句。但是,在清单 7.5 中的代码演示了一个你可以实现的方案。

  清单 7.5 从 try语句 跳转到finally 语句

  1: using System;

  2:

  3: class JumpTest

  4: {

  5: public static void Main()

  6: {

  7: try

  8: {

  9: Console.WriteLine("try");

  10: goto __leave;

  11: }

  12: finally

  13: {

  14: Console.WriteLine("finally");

  15: }

  16:

  17: __leave:

  18: Console.WriteLine("__leave");

  19: }

  20: }

  当这个应用程序运行时,输出结果为

  try

  finally

  __leave

  一个 goto 语句不能退出 一个finally 语段。甚至把 goto 语句放在 try 语句 段中,还是会立即返回控制到finally 语段。因此,goto 只是离开了 try 语段并跳转到finally 语段。直到 finally 中的代码完成运行后,才能到达__leave 标签。按这种方式,你可以模仿在SEH中使用的的__leave 语句。

  顺便地,你可能怀疑goto 语句被忽略了,因为它是try 语句中的最后一条语句,并且控制自动地转移到了finally .为了证明不是这样,试把goto 语句放到Console.WriteLine 方法调用之前。尽管由于不可到达代码你得到了编译器的警告,但是你将看到goto语句实际上被执行了,且没有为 try 字符串产生的输出。

  7.2.3 使用try-catch-finally处理所有异常

  应用程序最有可能的途径是合并前面两种错误处理技术——捕获错误、清除并继续执行应用程序。所有你要做的是在出错处理代码中使用 try 、catch 和 finally语句。清单 7.6 显示了处理零除错误的途径。

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

【责编:John】

中国IT教育

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