當(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ù)字。”
#!/usr/bin/env python
# _*_coding:utf-8 _*_
try:
n = int(input("請輸出一個(gè)數(shù)字>>> "))
print("你輸入的數(shù)字是",n)
# e是Exception的對象,Exception是一個(gè)類
except Exception as e:
print("輸入類型錯(cuò)誤,你因該輸入的是一個(gè)數(shù)字。")
輸出
yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
請輸出一個(gè)數(shù)字>>> 123
你輸入的數(shù)字是 123
yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
請輸出一個(gè)數(shù)字>>> abc
輸入類型錯(cuò)誤,你因該輸入的是一個(gè)數(shù)字。
常用異常
異常名 | 說明 |
---|---|
AttributeError | 試圖訪問一個(gè)對象沒有的樹形,比如foo.x,但是foo沒有屬性x |
IOError | 輸入/輸出異常;基本上是無法打開文件 |
ImportError | 無法引入模塊或包;基本上是路徑問題或名稱錯(cuò)誤 |
IndentationError | 語法錯(cuò)誤(的子類) ;代碼沒有正確對齊 |
IndexError | 下標(biāo)索引超出序列邊界,比如當(dāng)x只有三個(gè)元素,卻試圖訪問x[5] |
KeyError | 試圖訪問字典里不存在的鍵 |
KeyboardInterrupt | Ctrl+C被按下 |
NameError | 使用一個(gè)還未被賦予對象的變量 |
SyntaxError | Python代碼非法,代碼不能編譯(個(gè)人認(rèn)為這是語法錯(cuò)誤,寫錯(cuò)了) |
TypeError | 傳入對象類型與要求的不符合 |
UnboundLocalError | 試圖訪問一個(gè)還未被設(shè)置的局部變量,基本上是由于另有一個(gè)同名的全局變量,導(dǎo)致你以為正在訪問它 |
ValueError | 傳入一個(gè)調(diào)用者不期望的值,即使值的類型是正確的 |
對不同的異常進(jìn)行不同的處理
try:
n = int(input("請輸出一個(gè)數(shù)字>>> "))
except ValueError as e:
print("ValueError錯(cuò)誤")
except Exception as e:
print("出現(xiàn)異常")
輸出
yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
請輸出一個(gè)數(shù)字>>> 123
yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
請輸出一個(gè)數(shù)字>>> asd
ValueError錯(cuò)誤
在處理異常時(shí),如果出現(xiàn)錯(cuò)誤,那么會首先匹配ValueError
,然后在匹配Exception
。
捕獲多個(gè)錯(cuò)誤
try:
raise IndexError('出錯(cuò)了')
except (IndexError, NameError) as e: # 捕獲括號內(nèi)的錯(cuò)誤,并把錯(cuò)誤信息賦值給e
print(e)
try:
# 主代碼塊
pass
except KeyError as e:
# 異常時(shí),執(zhí)行該塊
pass
else:
# 主代碼塊執(zhí)行完,執(zhí)行該塊
pass
finally:
# 無論異常與否,最終執(zhí)行該塊
pass
執(zhí)行流程:
如果出現(xiàn)錯(cuò)誤,那么就執(zhí)行except
代碼塊,然后在執(zhí)行finally
如果沒有出現(xiàn)錯(cuò)誤,那么就執(zhí)行else
代碼塊,然后再執(zhí)行finally
不管有沒有出現(xiàn)異常都會執(zhí)行finally
#!/usr/bin/env python
# _*_coding:utf-8 _*_
try:
# raise表示主動出發(fā)異常,然后創(chuàng)建一個(gè)Exception對象,Exception括號內(nèi)的值就是Exception對象的值
raise Exception("主動出發(fā)的異常")
except Exception as e:
# 輸出Exception對象的值
print(e)
輸出
yangwen@Darker:~$ python3 /home/ansheng/文檔/Python_code/sublime/Week06/Day04/s2.py
主動出發(fā)的異常
如果需要捕獲和處理一個(gè)異常,又不希望異常在程序中死掉,一般都會利用raise傳遞異常
>>> try:
... raise IndexError('Index')
... except IndexError:
... print('error')
... raise
...
error
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: Index
如果條件成立則成立,如果條件不成立則報(bào)錯(cuò)。
# assert關(guān)鍵字,后面的是條件
>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
用戶自定義的異常通過類編寫,且通常需要繼承Exception
內(nèi)置的異常類,基于類的異常允許腳本建立異常類型、繼承行為以及附加狀態(tài)信息。
>>> class Bar(Exception):
... pass
...
>>>
>>> def doomed():
... raise Bar()
...
>>>
>>> try:
... doomed()
... except Bar as e:
... print('error')
...
error
如果要自定義錯(cuò)誤顯示信息,我們只需要在類中定義字符串重載(__str__
,__repr__
)方法中的其中一個(gè)即可:
>>> class MyError(Exception):
... def __str__(self):
... return '出錯(cuò)啦.'
...
>>> try:
... raise MyError()
... except MyError as e:
... print(e)
...
出錯(cuò)啦.
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: