Python異常處理

2018-06-08 17:19 更新


當(dāng)程序出現(xiàn)錯(cuò)誤的時(shí)候,進(jìn)行捕捉,然后根據(jù)捕捉到的錯(cuò)誤信息進(jìn)行對應(yīng)的處理

Even if a statement or expression is syntactically correct, it may cause an error when an attempt is made to execute it. Errors detected during execution are called exceptions and are not unconditionally fatal: you will soon learn how to handle them in Python programs.

初識異常處理

如下面的例子:

讓用戶進(jìn)行輸入,提示用戶輸入一個(gè)數(shù)字,如果輸入的事一個(gè)數(shù)字那個(gè)就把輸入的數(shù)字轉(zhuǎn)換為int類型,然后輸出用戶輸入的而數(shù)字,如果用戶輸入的不是一個(gè)數(shù)字,那么類型轉(zhuǎn)換就會出錯(cuò),如果出錯(cuò),就提示用戶”輸入類型錯(cuò)誤,你因該輸入的是一個(gè)數(shù)字。”

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. try:

  4.    n = int(input("請輸出一個(gè)數(shù)字>>> "))

  5.    print("你輸入的數(shù)字是",n)

  6. # e是Exception的對象,Exception是一個(gè)類

  7. except Exception as e:

  8.    print("輸入類型錯(cuò)誤,你因該輸入的是一個(gè)數(shù)字。")

輸出

  1. yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py

  2. 請輸出一個(gè)數(shù)字>>> 123

  3. 你輸入的數(shù)字是 123

  4. yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py

  5. 請輸出一個(gè)數(shù)字>>> abc

  6. 輸入類型錯(cuò)誤,你因該輸入的是一個(gè)數(shù)字。

異常分類

常用異常

異常名說明
AttributeError試圖訪問一個(gè)對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError輸入/輸出異常;基本上是無法打開文件
ImportError無法引入模塊或包;基本上是路徑問題或名稱錯(cuò)誤
IndentationError語法錯(cuò)誤(的子類) ;代碼沒有正確對齊
IndexError下標(biāo)索引超出序列邊界,比如當(dāng)x只有三個(gè)元素,卻試圖訪問x[5]
KeyError試圖訪問字典里不存在的鍵
KeyboardInterruptCtrl+C被按下
NameError使用一個(gè)還未被賦予對象的變量
SyntaxErrorPython代碼非法,代碼不能編譯(個(gè)人認(rèn)為這是語法錯(cuò)誤,寫錯(cuò)了)
TypeError傳入對象類型與要求的不符合
UnboundLocalError試圖訪問一個(gè)還未被設(shè)置的局部變量,基本上是由于另有一個(gè)同名的全局變量,導(dǎo)致你以為正在訪問它
ValueError傳入一個(gè)調(diào)用者不期望的值,即使值的類型是正確的

對不同的異常進(jìn)行不同的處理

  1. try:

  2.    n = int(input("請輸出一個(gè)數(shù)字>>> "))

  3. except ValueError as e:

  4.    print("ValueError錯(cuò)誤")

  5. except Exception as e:

  6.    print("出現(xiàn)異常")

輸出

  1. yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py

  2. 請輸出一個(gè)數(shù)字>>> 123

  3. yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py

  4. 請輸出一個(gè)數(shù)字>>> asd

  5. ValueError錯(cuò)誤

在處理異常時(shí),如果出現(xiàn)錯(cuò)誤,那么會首先匹配ValueError,然后在匹配Exception。

捕獲多個(gè)錯(cuò)誤

  1. try:

  2.    raise IndexError('出錯(cuò)了')

  3. except (IndexError, NameError) as e:  # 捕獲括號內(nèi)的錯(cuò)誤,并把錯(cuò)誤信息賦值給e

  4.    print(e)

錯(cuò)誤異常的基本結(jié)構(gòu)

  1. try:

  2.    # 主代碼塊

  3.    pass

  4. except KeyError as e:

  5.    # 異常時(shí),執(zhí)行該塊

  6.    pass

  7. else:

  8.    # 主代碼塊執(zhí)行完,執(zhí)行該塊

  9.    pass

  10. finally:

  11.    # 無論異常與否,最終執(zhí)行該塊

  12.    pass

執(zhí)行流程:

  1. 如果出現(xiàn)錯(cuò)誤,那么就執(zhí)行except代碼塊,然后在執(zhí)行finally

  2. 如果沒有出現(xiàn)錯(cuò)誤,那么就執(zhí)行else代碼塊,然后再執(zhí)行finally

  3. 不管有沒有出現(xiàn)異常都會執(zhí)行finally

主動出發(fā)異常

  1. #!/usr/bin/env python

  2. # _*_coding:utf-8 _*_

  3. try:

  4.    # raise表示主動出發(fā)異常,然后創(chuàng)建一個(gè)Exception對象,Exception括號內(nèi)的值就是Exception對象的值

  5.    raise Exception("主動出發(fā)的異常")

  6. except Exception as e:

  7.    # 輸出Exception對象的值

  8.    print(e)

輸出

  1. yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py

  2. 主動出發(fā)的異常

如果需要捕獲和處理一個(gè)異常,又不希望異常在程序中死掉,一般都會利用raise傳遞異常

  1. >>> try:

  2. ...     raise IndexError('Index')

  3. ... except IndexError:

  4. ...     print('error')

  5. ...     raise

  6. ...

  7. error

  8. Traceback (most recent call last):

  9.  File "<stdin>", line 2, in <module>

  10. IndexError: Index

斷言

如果條件成立則成立,如果條件不成立則報(bào)錯(cuò)。

  1. # assert關(guān)鍵字,后面的是條件

  2. >>> assert 1 == 1

  3. >>> assert 1 == 2

  4. Traceback (most recent call last):

  5.  File "<stdin>", line 1, in <module>

  6. AssertionError

自定義異常

用戶自定義的異常通過類編寫,且通常需要繼承Exception內(nèi)置的異常類,基于類的異常允許腳本建立異常類型、繼承行為以及附加狀態(tài)信息。

  1. >>> class Bar(Exception):

  2. ...     pass

  3. ...

  4. >>>

  5. >>> def doomed():

  6. ...     raise Bar()

  7. ...

  8. >>>

  9. >>> try:

  10. ...     doomed()

  11. ... except Bar as e:

  12. ...     print('error')

  13. ...

  14. error

如果要自定義錯(cuò)誤顯示信息,我們只需要在類中定義字符串重載(__str____repr__)方法中的其中一個(gè)即可:

  1. >>> class MyError(Exception):

  2. ...     def __str__(self):

  3. ...         return '出錯(cuò)啦.'

  4. ...

  5. >>> try:

  6. ...     raise MyError()

  7. ... except MyError as e:

  8. ...     print(e)

  9. ...

  10. 出錯(cuò)啦.


本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號