BOO入门/例外
外观
< BOO入門
BOO入门 > 例外 (上一章:列举 下一章:将函数当作物件与多执行绪)
例外非常重要,每当系统发生错误时,例外就会被提出。
捕捉例外
[编辑]如果没有捕捉到例外的话,程序将会被中止。
// Division by Zero
print 1 / 0
输出结果
System.DivideByZeroException: Attempted to divide by zero. at Test.Main(String[] argv)
这个例外造成程序中止。
要处理这种情形,我们得捕捉例外。我们可以使用 try-except 述句、try-ensure 述句或者是 try-except-ensure 述句。所有的例外都继承自 Exception 类别。
// try-except 範例
import System
try:
print 1 / 0
except e as DivideByZeroException:
print "Whoops"
print "Doing more..."
输出结果
Whoops Doing more...
如你所见到,在捕捉例外之后,程序不会因为错误而中止,仍旧继续执行。
捕捉错误并不只限于一个,你可以写多个 except 来捕捉多种例外。
Try-ensure 用在确保某些事情能完成,不管错误有没有发生。
// try-ensure 範例
import System
try:
s = MyClass()
s.SomethingBad()
ensure:
print "This code will be executed, whether there is an error or not."
输出结果
This code will be executed, whether there is an error or not. System.Exception: Something bad happened. at Test.Main(String[] argv)
从上面例子你可以看到,ensure 区块里的程式不管错误有没有发生都会被执行。
而 try-except-ensure 则结合两者:
// try-except-ensure 範例
import System
try:
s = MyClass()
s.SomethingBad()
except e as Exception:
print "Problem! ${e.Message}"
ensure:
print "This code will be executed, whether there is an error or not."
输出结果
Problem: Something bad happened. This code will be executed, whether there is an error or not.
提出例外
[编辑]或许你会想提出自己的例外,这时候可以使用 raise 关键字。
// 提出例外
import System
def Execute(i as int):
if i < 10:
raise Exception("引數 i 必須大於或等於 10")
print i
当传入不适当的值给 Execute 时,例外将会被提出。
译注:原文为 Raising Exceptions,C++ 用 throw,因此可以用掷出例外或丢出例外,用 Raise,我想用提出例外或许比较好。
练习
[编辑]- 试著去捕捉多个例外看看
- 试著继承 Exception,并且提出(raise)