Python用異常對象(exception object)來表示異常情況。遇到錯誤后會引發異常。如果異常對象沒有被處理或捕捉,程序就會用回溯(Traceback,一種錯誤信息)終止執行。
打開一個不存在的文件,會引發異常。
open('1.txt', 'r')
錯誤信息
Traceback (most recent call last):
File "test.py", line 26, in <module>
open('1.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
捕獲異常
try:
print num
except NameError:
print('產生錯誤了')
捕獲多個異常
try:
open('123.txt','r') # 如果123.txt文件不存在,那么會產生異常
print(num) #如果num變量沒有定義,那么會產生 NameError 異常
except (IOError,NameError) as e:
#如果想通過一次except捕獲到多個異常可以用一個元組的方式
# e里會保存捕獲到的錯誤信息
print(e)
使用try except不帶異常類型
try:
#正常的操作
...
except :
#發生異常,執行代碼
...
else:
#沒有異常,執行這塊代碼
...
try...finally語句
在程序中,如果一個段代碼必須要執行,即無論異常是否產生都要執行,那么此時就需要使用finally。 比如文件關閉,釋放鎖,把數據庫連接返還給連接池等。
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在讀取文件的過程中,產生了異常,那么就會捕獲到
#比如 按下了 ctrl+c
pass
finally:
f.close()
print('關閉文件')
except:
print("沒有這個文件")
說明
test.txt文件中每一行數據打印,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程序運行得慢一些。在程序運行的時候,按Ctrl+c中斷(取消)程序。
拋出自定義異常
你可以用raise語句來引發一個異常。異常/錯誤對象必須有一個名字,且它們應是Error或Exception類的子類。
class ShortInputException(Exception):
'''自定義的異常類'''
def __init__(self, length, atleast):
#super().__init__()
self.length = length
self.atleast = atleast
def main():
try:
s = input('請輸入 --> ')
if len(s) < 3:
# raise引發一個你定義的異常
raise ShortInputException(len(s), 3)
except ShortInputException as result:#x這個變量被綁定到了錯誤的實例
print('ShortInputException: 輸入的長度是 %d,長度至少應是 %d'% (result.length, result.atleast))
else:
print('沒有異常發生.')
main()
異常處理中拋出異常
class Test(object):
def __init__(self, switch):
self.switch = switch #開關
def calc(self, a, b):
try:
return a/b
except Exception as result:
if self.switch:
print("捕獲開啟,已經捕獲到了異常,信息如下:")
print(result)
else:
#重新拋出這個異常,此時就不會被這個異常處理給捕獲到,從而觸發默認的異常處理
raise
a = Test(True)
a.calc(11,0)
print("----------------------華麗的分割線----------------")
a.switch = False
a.calc(11,0)
運行結果
捕獲開啟,已經捕獲到了異常,信息如下:
division by zero
----------------------華麗的分割線----------------
Traceback (most recent call last):
File "djc.py", line 46, in <module>
a.calc(11,0)
File "djc.py", line 30, in calc
return a/b
ZeroDivisionError: division by zero