1. 程式人生 > >Python引發異常,raise()及異常處理

Python引發異常,raise()及異常處理

raise()

用raise語句來引發一個異常。異常/錯誤物件必須有一個名字,且它們應是Error或Exception類的子類。

丟擲異常和自定義異常

Python用異常物件(exception object)表示異常情況,遇到錯誤後,會引發異常。如果異常物件並未被處理或捕捉,程式就會用所謂的回溯(Traceback,一種錯誤資訊)終止執行。

raise 語句

Python中的raise 關鍵字用於引發一個異常,基本上和C#和Java中的throw關鍵字相同,如下所示:

def ThorwErr():
    raise Exception("丟擲一個異常") 
# Exception: 丟擲一個異常 
ThorwErr()
  • 1
  • 2
  • 3
  • 4

raise關鍵字後面是丟擲是一個通用的異常型別(Exception),一般來說丟擲的異常越詳細越好,Python在exceptions模組內建了很多的異常型別,通過使用dir函式來檢視exceptions中的異常型別,如下:

import exceptions

# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)
  • 1
  • 2
  • 3
  • 4

傳遞異常

捕捉到了異常,但是又想重新引發它(傳遞異常),可以使用不帶引數的raise語句即可:

 class MuffledCalculator:
     muffled = False
def calc(self,expr): try: return eval(expr) except ZeroDivisionError: if self.muffled: print 'Division by zero is illegal' else: raise
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

自定義異常型別

Python中也可以自定義自己的特殊型別的異常,只需要要從Exception類繼承(直接或間接)即可:

class SomeCustomException(Exception):
    pass
  • 1
  • 2

捕捉異常

捕捉一個異常

和C#中的try/catch類似,Python中使用try/except關鍵字來捕捉異常,如下:

try:
    print 2/0
except ZeroDivisionError:
    print '除數不能為0'
  • 1
  • 2
  • 3
  • 4

捕捉多個異常

在一個except語句只捕捉其後宣告的異常型別,如果可能會丟擲的是其他型別的異常就需要再增加一個except語句了,或者也可以指定一個更通用的異常型別比如:Exception,如下:

try:
    print 2/'0'
except ZeroDivisionError:
    print '除數不能為0'
except Exception:
    print '其他型別異常'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

為了捕獲多個異常,除了宣告多個except語句之外,還可以在一個except語句之後將多個異常作為元組列出來即可:

try:
    print 2/'0'
except (ZeroDivisionError,Exception):
    print '發生了一個異常'
  • 1
  • 2
  • 3
  • 4

獲取異常資訊

每個異常都會有一些異常資訊,一般情況下我們應該把這些異常資訊記錄下來:

try:
    print 2/'0'
except (ZeroDivisionError,Exception) as e:
    # unsupported operand type(s) for /: 'int' and 'str'
    print e 
  • 1
  • 2
  • 3
  • 4
  • 5

finally子句

finally子句和try子句聯合使用但是和except語句不同,finally不管try子句內部是否有異常發生,都會執行finally子句內的程式碼。所有一般情況下,finally自己常常用於關閉檔案或者在Socket中。

try:
    print 2/'0'
except (ZeroDivisionError,Exception):
    print '發生了一個異常'
finally:
    print '不管是否發生異常都執行'