| | | .NET异常代码编写 | | 2001-10-17·
·Eric Gunnerson··YESKY
| 上一页 1 2 3 4 5 6 下一页 Catch语句的排列顺序
我们可以在一个try语句中放置多个catch语句,每个catch语句捕获一种不同类型的异常。在前面这个例子中,对ArgumentException做一个特殊的处理是挺有必要的,对其它的异常可以进行另外的处理。
这个例子如下:
try { Process(currentLocation); Console.WriteLine("Done processing"); } catch (ArgumentException e) { // handle the exception here } catch (Exception e) { // handle the more general exception here } | 当使用了多个catch语句时,导出类型必须列在它的任何基类之前。这有助于提高可读性。你可以更早地判断出运行时(Runtime)的行为。
Catch Operations
现在我们捕获了一个异常(exception),希望用它做一些有用的事。我们要做的第一件事就是想把这个异常用一些额外的上下文信息包装起来。
我们用下面的方法来实现:
try { Process(currentLocation); Console.WriteLine("Done processing"); } catch (ArgumentException e) { throw new ArgumentException("Error while processing", e); } | 这里使用了ArgumentException的构造器,它接受了一个信息和一个异常。构造器把传递给它的这个异常用一个新的异常包装了起来并抛出。
这个过程给开发者们提供了一种极大的便利。将异常包装起来就得到了类似于堆栈跟踪(stack trace)的结果,而不仅仅是一些关于异常的单一信息:
System.Exception: Exception in Test1 ---> System.Exception: Exception in Test2 ---> System.DivideByZeroException: Attempted to divide by zero. | 如果你在编译时使用了/debug开关,这样的输出将使大大方便调试。你还可以得到每一级的文件名和行号。
异常(exceptioin)的包装在为调试提供额外的信息方面很有用。另外一种很有帮助的场合就是在你需要根据一个异常采取相应的行动的时候。把输出写入一个文件的实现代码应该像下面这样:
try { FileStream f = new FileStream(filename, FileMode.Create); StreamWriter s = new StreamWriter(f); s.WriteLine("{0} {1}", "test", 55); s.Close(); f.Close(); } catch (IOException e) { Console.WriteLine("Error opening file {0}", filename); Console.WriteLine(e); } | 如果这个文件不能被打开,系统就抛出一个异常,catch语句就被触发,产生一个错误,程序可继续执行下去。在大多数情况下,这是没问题的。 但是当出现下面这种情况时问题就来了:一个异常出现在这个文件刚被打开后,这样该文件将无法被关闭,这是有害的。
这里需要的是一种能保证即使在异常发生的情况下,文件仍能被关闭的方法。
上一页 1 2 3 4 5 6 下一页 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|