Python學習筆記之異常處理
一、異常的語法
python的異常處理語法比較靈活,具有多種,掌握python異常處理的語法的關鍵是要明白,異常語法中的每個關鍵字的不同含義。只要我們明白關鍵字的含義,那麼語法也只是一種組合而已。
try: f = open('/etc/passwd') print(f1) f.read() except OSError as err: print("OS error: {0}".format(err)) except Exception as err: print(err) else: print("all success") finally: f.close() print(f.closed)
輸出:
name 'f1' is not defined
True
在上面一段程式碼中我們有try except else finally 四個主要的關鍵字,我們先介紹try,try是告訴python直譯器我下面的這些程式碼可能會出錯,我需要異常處理,在我出錯的時候將錯誤丟擲。
except關鍵字後面接的是改段程式處理的異常型別,如果try語句塊丟擲的異常的型別是except可可接收的異常型別相同,那麼except語句塊就可以執行,如果不是就可以判斷下一個except語句塊。
else 關鍵字裡面的語句,是所有的except語句塊條件不滿足,最後被執行的,也就是說我們的try語句塊丟擲了一個我們寫的except語句塊未檢測到的異常型別。如果else語句之前的except語句塊被執行了,那麼else語句塊就不會被執行。
finally是指在try語句塊丟擲異常之後,不論我們的except語句塊,else語句塊被執行與否,finally語句塊都會被執行。
二、異常的型別
在python中我們的每一個異常型別都是一個類,我們在官網找到了所有異常類的繼承關係樹如下:
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning
從上面的樹形圖我們可以看到,BaseException類是所有的異常類的基類。如果罵我們想要捕捉所有的系統自定義的異常型別,我們就可以使用 except BaseException:語句去實現。
下面一是一些官網的異常示例程式碼
try:
file_it = open('/etc/group','r')
print(file_it.read())
except Exception as e:
print(e)
#如果沒有異常,則執行else 程式碼
else:
print('all success')
#不論是否有異常被丟擲,finally的程式碼都會被執行
finally:
file_it.close()
while True:
try:
x = int(input('Please enter a number:'))
except ValueError:
print('Oops! That was no valid number')
import sys
try:
file_it = open('/tmp/passwd')
s = file_it.readline()
i = int(s.strip())
print(a)
except OSError as err:
print('OS error:{0}'.format(err))
except ValueError:
print('Could not convert data to integer.')
except:
print('Unexpected error:',sys.exc_info()[1])
else:
print('all ok')
三、自定義異常型別 如果我們需要丟擲一個自己定義的異常,那麼需要們定義一個繼承於Exception的類如下面程式碼
class Error_Test(Exception):
pass
try:
print('all is well')
raise Error_Test('all is well') #Error_Test 類雖然沒有建構函式,但是他的父類有
except Error_Test as err:
print(err)
finally:
print('ok')
raise 關鍵字用於程式設計師主動丟擲異常,而不是在編譯器報錯的時候自動丟擲異常,因此使用raise的try語句塊丟擲異常後,該語句塊不一定有錯誤。