程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python進階系列(十一)

編輯:Python

異常

異常處理是一種藝術,一旦你掌握,會授予你無窮的力量。我將要向你展示我們能處理異常的一些方式。

最基本的術語裡我們知道了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

當你不知道你的程序會拋出什麼樣的異常時,上面的方式可能非常有幫助。

finally從句

我們把我們的主程序代碼包裹進了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!

try/else從句

我們常常想在沒有觸發異常的時候執行一些代碼。這可以很輕松地通過一個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語句之前執行。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved