'%d is not within the valid range of %d..%d',
[Result, Min, Max]);
end;
注意raise语句中调用的CreateFmt方法。Exception和它的派生类有特殊的构造函数,提供了可选择的方法来创建异常消息和context ID。
被引发的(raised)异常在处理后自动清除,永远不要试图手动销毁它。
注意:在单元的初始化部分引发一个异常可能无法产生预期的结果。对异常的正规支持来自SysUtils单元,在获得这种支持之前,它必须被初始化。如果在初始化期间产生了异常,所有被初始化的单元(包括SysUtils)执行结束化处理,并重新引发异常。然后,通常是结束程序来捕获和处理异常(Then the
- 117 -
Classes and objects
exception is caught and handled, usually by interrupting the program)。
Try … except statements(Try … except语句)
异常在try...except语句中被处理,比如,
try
X := Y/Z; except
on EZeroDivide do HandleZeroDivide; end;
上面的语句尝试Y被Z除,若EZeroDivide异常发生,则调用例程try...except语句的语法是
try statements except exceptionBlock end
这里,statements是语句序列(由分号隔开的一系列语句)? 其它语句序列,或者是
? 一系列异常处理程序,后面跟可选的 else statements
一个异常处理程序具有如下格式
on identifier: type do statement
这里,identifier:是可选的(若有的话,它可以是任何有效标志符)何语句。
一个try...except语句执行开始处的(初始)代码,若没有引发异常,异常代码段(略,程序控制转到下一部分。
若执行初始代码时发生了异常(或者执行了raise语句,或者是调用过程或函数引起的)进行处理:
? 若异常处理块(exception block)中有对应的异常,则控制权交给第一个匹配的处理程序。当处理程
序中指定的异常类和(发生的)异常所属的类相同,或者是异常的祖先类时,我们说,这个异常处理程序与这个异常相“匹配”。
? 若没有发现相应的异常处理程序,当有else子句时,程序控制转到? 若异常处理块中没有异常处理程序,而只是语句序列,则程序控制转到它的第一个语句。如果上面的条件都不成立,会继续搜索下一个try...except子句或语句序列,搜索会继续扩展到下一个try...except语句块,语句块并且异常还没有被处理,程序就会终止。 当处理一个异常时,堆栈退回到包含try...except语句的过程或函数,子句或语句序列。这个过程忽略所有进入try...except后调用的过程和函数,然后,异常对象自动调用析构函数进行销毁,程序控制权转给try...except后面的语句。制权离开了异常处理程序,异常对象也会自动销毁。)
在下面的例子中,第1个异常处理程序处理被0除异常,第算异常。EMathError在最后出现,因为它是另外两个异常的祖先,若它最先出现,另外两个将永远不会被调用。
try ... except
on EZeroDivide do HandleZeroDivide; on EOverflow do HandleOverflow;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-88.html
实为恶狗假自在