1. 程式人生 > >python3 異常及異常處理

python3 異常及異常處理

異常

@(python3)

python 用 異常物件(exception object)來表示異常情況。異常物件可以被處理、捕獲,避免程式終止執行。

內建異常類

Exception   所有異常的基類

AttributeError  特徵引用或者賦值失敗時引發的

IOError 試圖打在不存在的檔案(包括其他情況)

IndexError  使用序列中不存在的索引

KeyError    使用對映中不存在的鍵

NameError   找不到名字(變數)

SyntaxError 在程式碼為錯誤形式時引發

SystemExit  系統異常退出

TypeError   在內建操作或者函式應用與錯誤型別的物件時

ValueError  正確的型別物件,但是物件使用不合適的值

ZeroDivisionError   除法,第二引數為0

自定義異常

可以建立一個新的exception類來擁有自己的異常。異常應該繼承自 Exception 類,或者直接繼承,或者間接繼承

class MyError(Exception):
    pass
  • 自定義異常也可以在類裡面定義方法

捕捉異常

基本形式:

try:
    需要執行的操作
except 異常類 as e:
    如果發生異常,執行以下程式碼
else:
    如果沒有發生異常,執行的命令
finally:
    無論如何,都要執行的程式碼
  • 注意 except as e 的寫法,e 是一個變數,記錄了異常的類,可以用 print 函式打印出來
  • except 後面的異常類,建議寫 Exception,這樣就一定能捕獲到異常。
  • 捕獲到異常,就不會去執行 else 模組

示例:

try:
    name = input('Please input your name: ')
    print('Hello %s' %name)
    print(10/0)
except Exception as e:
    print('Got an error ', e)
finally:
    print('Game over')

捕獲多個異常

方法一:

try:
    需要執行的操作
except 異常類 as e:
    如果發生異常,執行以下程式碼
except
異常類 as f: 如果發生異常,執行以下程式碼 else: 如果沒有發生異常,執行的命令 finally: 無論如何,都要執行的程式碼
  • except 後面的異常類,如果無需指定,直接寫 Exception 即可。
  • 如果需要明確指定異常的類,而且是多個類的情況下,可以使用多個 except 語句。

方法二:

try:
    需要執行的操作
except (異常類1,異常2,異常3) as e:
    如果發生異常,執行以下程式碼
else:
    如果沒有發生異常,執行的命令
finally:
    無論如何,都要執行的程式碼

丟擲異常

raise 關鍵字可以自主丟擲異常,規則如下:

raise NameError([str])

  • raise 後面跟異常的類,類括號裡面,可以指定要丟擲的異常示例,約詳細越好
>>> raise NameError()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError


>>> raise NameError('bad name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: bad name

raise 如果用在 try / except 語句中,那麼會直接丟擲異常,並終止程式執行。不影響 finally 語句的執行。

while True:
    try:
        a = input('Plase input a number: ')
        b = input('Plase input a number: ')
        print(a/b)
    except Exception as e:
        print('Error happend, please do agin')
        raise e
    else:
        print('No error happend')

異常實現迴圈

在迴圈沒有異常的情況下,才會退出迴圈。

while True:
    try:
        a = input('Plase input a number: ')
        b = input('Plase input a number: ')
        print(a/b)
    except Exception as e:
        print('Error happend, please do agin')
        print(e)
    else:
        print('No error happend')