Python 一开始执行程序时,会先全面检查语法,如果语法错误,就会停止执行,此时必须修正语法,然后重新执行。如果语法没有错误,但在执行过程中发生系统无法处理的错误,此时系统会产生一个异常(Exception),如果此异常没有被处理,那么就会一层层往上送给呼叫它的程序,直到有程序出面处理为止。如果送到最上层都没有被处理,那么就会终止程序的执行并显示错误讯息。例如:
为了避免程序因发生异常而被终止,我们可以在有可能出错的地方,用 try 来捕捉异常并加以处理。其基本语法如下:
try:
# 可能发生异常的区块
except:
# 异常处理区块
当 try 区块中的程序发生异常时,就会直接跳到 except 区块去进行处理。例如:
s = 'a'
try:
i = int(s)
print('没发生异常')
except:
print('发生异常')
print('程序结束')
当执行到 int(s) 时,因为 s 不是整数的字符串,所以会发生 ValueError 异常,然后直接跳到 except 区块。
捕捉特定的异常
我们也可以用:
except 特定异常类型 as 变量名称 :
来捕捉特定的异常类型,并用 as 后的变量名称来取得异常的讯息。若不需要可以省略。
except 可以补捉多种异常类型,例如底下的程序检查了 ValueError、ZeroDivisonError 以及二者之外的其他错误。
while True:
s = input('请输入 100 的除数:')
try:
i = 100 / float(s)
print('100 除', s, '=', i)
break
except ValueError as ex: # 捕捉值错误的异常,并将异常存到 ex
print('发生 ValueError 异常:', ex) # 查看 ex 的内容
except ZeroDivisionError: #捕捉零除的异常
print('发生 ZeroDivisionError 异常')
except:
print('其他异常')
以上空的 except 要放在所有 except 的最后面,表示如果前面几个都没捕捉到,就在此处理。
如果空的 except 要用变量获得错误讯息,可以改成『except BaseException as ex:』,其中 BaseException 代表通用异常。
也可以将多个异常放在 tuple 中来一次捕捉,例如:『except (ValueError, NameError) as ex:』。
try … except … else … finally …
在 try… except … 的后面还可再加上 else … 和 finally …,else 区块表示未发生异常时才执行的区块。而 finally 则是无论是否发生异常,最后都会执行的收尾区块。
while True:
s = input('请输入 100 的除数:')
try:
i = 100 / float(s)
except ValueError as ex: # 捕捉值错误的异常,并将异常存到 ex
print('发生 ValueError 异常:', ex) # 查看 ex 的内容
except ZeroDivisionError: #捕捉零除的异常
print('发生 ZeroDivisionError 异常')
except:
print('其他异常')
else:
print('100 除', s, '=', i)
break
finally:
print('你的输入是:', s)