異常處理是一種藝術,一旦你掌握,會授予你無窮的力量。我將要向你展示我們能處理異常的一些方式。
最基本的術語裡我們知道了try/except從句。可能觸發異常產生的代碼會放到try語句塊裡,而處理異常的代碼會在except語句塊裡實現。這是一個簡單的例子:
try:
file = open('test.txt', 'rb')
except IOError as e:
print('An IOError occurred. {}'.format(e.args[-1]))
上面的例子裡,我們僅僅在處理一個IOError的異常。大部分初學者還不知道的是,我們可以處理多個異常。
我們可以使用三種方法來處理多個異常。
第一種方法需要把所有可能發生的異常放到一個元組裡。像這樣:
try:
file = open('test.txt', 'rb')
except (IOError, EOFError) as e:
print("An error occurred. {}".format(e.args[-1]))
另外一種方式是對每個單獨的異常在單獨的except語句塊中處理。我們想要多少個except語句塊都可以。這裡是個例子:
try:
file = open('test.txt', 'rb')
except EOFError as e:
print("An EOF error occurred.")
raise e
except IOError as e:
print("An error occurred.")
raise e
上面這個方式中,如果異常沒有被第一個except語句塊處理,那麼它也許被下一個語句塊處理,或者根本不會被處理。
現在,最後一種方式會捕獲所有異常:
try:
file = open('test.txt', 'rb')
except Exception:
# 打印一些異常日志,如果你想要的話
raise
當你不知道你的程序會拋出什麼樣的異常時,上面的方式可能非常有幫助。
我們把我們的主程序代碼包裹進了try從句。然後我們把一些代碼包裹進一個except從句,它會在try從句中的代碼觸發異常時執行。
在下面的例子中,我們還會使用第三個從句,那就是finally從句。包裹到finally從句中的代碼不管異常是否觸發都將會被執行。這可以被用來在腳本執行之後做清理工作。
這裡是個簡單的例子:
try:
file = open('test.txt', 'rb')
except IOError as e:
print('An IOError occurred. {}'.format(e.args[-1]))
finally:
print("This would be printed whether or not an exception occurred!"
Output: An IOError occurred. No such file or directory
This would be printed whether or not an exception occurred!
我們常常想在沒有觸發異常的時候執行一些代碼。這可以很輕松地通過一個else從句來達到。
有人也許問了:如果你只是想讓一些代碼在沒有觸發異常的情況下執行,為啥你不直接把代碼放在try裡面呢?
回答是,那樣的話這段代碼中的任意異常都還是會被try捕獲,而你並不一定想要那樣。
大多數人並不使用else從句,而且坦率地講我自己也沒有大范圍使用。這裡是個例子:
try:
print('I am sure no exception is going to occur!')
except Exception:
print('exception')
else:
print('This would only run if no exception occurs.')
finally:
print('This would be printed in every case.')
這裡的代碼只會在try語句裡沒有觸發異常時運行,
但是這裡的異常將 *不會* 被捕獲
Output: I am sure no exception is going to occur!
This would only run if no exception occurs.
This would be printed in every case.
else從句只會在沒有異常的情況下執行,而且它會在finally語句之前執行。