Python異常處理

2018-06-08 17:19 更新


當(dāng)程序出現(xiàn)錯(cuò)誤的時(shí)候,進(jìn)行捕捉,然后根據(jù)捕捉到的錯(cuò)誤信息進(jìn)行對(duì)應(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.

初識(shí)異常處理

如下面的例子:

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

  1. #!/usr/bin/env python

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

  3. try:

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

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

  6. # e是Exception的對(duì)象,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. 請(qǐng)輸出一個(gè)數(shù)字>>> 123

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

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

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

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

異常分類

常用異常

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

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

  1. try:

  2.    n = int(input("請(qǐng)輸出一個(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. 請(qǐng)輸出一個(gè)數(shù)字>>> 123

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

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

  5. ValueError錯(cuò)誤

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

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

  1. try:

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

  3. except (IndexError, NameError) as e:  # 捕獲括號(hào)內(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.    # 無(wú)論異常與否,最終執(zhí)行該塊

  12.    pass

執(zhí)行流程:

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

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

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

主動(dòng)出發(fā)異常

  1. #!/usr/bin/env python

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

  3. try:

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

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

  6. except Exception as e:

  7.    # 輸出Exception對(duì)象的值

  8.    print(e)

輸出

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

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

如果需要捕獲和處理一個(gè)異常,又不希望異常在程序中死掉,一般都會(huì)利用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

自定義異常

用戶自定義的異常通過(guò)類編寫,且通常需要繼承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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)