1. 程式人生 > >python中 try 與raise 語句的用法

python中 try 與raise 語句的用法

try語句是這樣工作的:
  首先,執行try子句(在try和except之間的語句)。
  如果沒有發生例外,跳過except子句,try語句執行完畢。
  如果在try子句中發生了例外錯誤而且例外錯誤匹配except後指定的例外名,則跳過try 子句剩下的部分,執行except子句,然後繼續執行try語句後面的程式。
  如果在try子句中發生了例外錯誤但是例外錯誤不匹配except後指定的例外名,則此例外被傳給外層的try語句。如果沒有找到匹配的處理程式則此例外稱作是未處理例外,程式停止執行,顯示錯誤資訊。
  try語句可以有多個except子句,為不同的例外指定不同處理。至多隻執行一個錯誤處理程式。錯誤處理程式只處理相應的try子句中發生的例外,如果同try語句中其它的錯誤處理程式中發生例外錯誤處理程式不會反應。一個except子句可以列出多個例外,寫在括號裡用逗號分開,例如:
... except (RuntimeError, TypeError, NameError):
...     pass
  最後一個except子句可以省略例外名,作為一個通配項。這種方法要謹慎使用,因為這可能會導致程式實際已出錯卻發現不了。
  try ... except語句有一個可選的else子句,如有的話要放在所有except子句之後。else 的意思是沒有發生例外,我們可以把try子句中沒有發生例外時要做的事情放在這個子句裡。例如:
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print '不能開啟', arg
    else:
        print arg, '有', len(f.readlines()), '行'
        f.close()
  例外發生時可能伴有一個值,叫做例外的引數。引數是否存在及其型別依賴於例外的型別。對於有引數的例外,except在自居可以在例外名(或表)後指定一個變數用來接受例外的引數值,如:
>>> try:
...     spam()
... except NameError, x:
...     print 'name', x, 'undefined'
...
name spam undefined
  有引數的例外未處理時會在錯誤資訊的最後細節部分列出其引數值。 
  例外處理程式不僅處理直接產生於try子句中的例外,也可以處理try子句中呼叫的函式(甚至是間接呼叫的函式)中的例外。如:
8.4 產生例外


  raise語句允許程式設計師強行產生指定的例外。例如:
>>> raise NameError, 'HiThere'
Traceback (innermost last):
  File "", line 1
NameError: HiThere
  raise語句的第一個引數指定要產生的例外的名字。可選的第二引數指定例外的引數。 
8.5 使用者自定義例外
  程式中可以定義自己的例外,只要把一個字串賦給一個變數即可。例如:
>>> my_exc = 'my_exc'
>>> try:
...     raise my_exc, 2*2
... except my_exc, val:
...     print 'My exception occurred, value:', val
...
My exception occurred, value: 4
>>> raise my_exc, 1
Traceback (innermost last):
  File "", line 1
my_exc: 1
  許多標準模組用這種方法報告自己定義的函式中發生的錯誤。 
8.6 定義清理動作

  try語句還有另一個finally可選子句,可以用來規定不論出錯與否都要執行的動作。例如:
>>> try:
...     raise KeyboardInterrupt
... finally:
...     print 'Goodbye, world!'
...
Goodbye, world!
Traceback (innermost last):
  File "", line 2
KeyboardInterrupt
  finally子句不論try子句中是否發生例外都會執行。例外發生時,先執行finally子句然後重新提出該例外。當try語句用break或return語句退出時也將執行finally子句。
  要注意的是,try語句有了except子句就不能有finally子句,有了finally子句就不能有except 子句,不能同時使用except子句和finally子句。需要的話可以巢狀。 --------------------- 本文來自 mr_jj_lian 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/mr_jj_lian/article/details/6786052?utm_source=copy