三、注意事項
錯誤
:**不符合規範,無法被識別和執行。
異常
:程式語法正確,可以被執行,但是執行過程中遇到了錯誤,丟擲異常。
示例:
#缺少冒號,錯誤
if name is
notnone
print
(name)
#異常 10/
0traceback (most recent call last)
: file ""
, line 1,in
zerodivisionerror: integer division or modulo by zero
通常難以保證程式覆蓋所有異常型別,可在最後的except block,宣告其處理的異常為exception。
exception是其他所有非系統異常的基類,能夠匹配任意非系統異常。
示例:
try
: s =
input
('please enter two numbers separated by comma: '
) num1 =
int(s.split(
',')[0
].strip())
num2 =
int(s.split(
',')[1
].strip())
...except valueerror as err:
print
('value error: {}'
.format
(err)
)except indexerror as err:
print
('index error: {}'
.format
(err)
)except exception as err:
print
('other error: {}'
.format
(err)
)
或者在except後省略異常型別,表示與任意異常相匹配(包括系統異常 ):
try
: s =
input
('please enter two numbers separated by comma: '
) num1 =
int(s.split(
',')[0
].strip())
num2 =
int(s.split(
',')[1
].strip())
...except valueerror as err:
print
('value error: {}'
.format
(err)
)except indexerror as err:
print
('index error: {}'
.format
(err)
)except
:print
('other error'
)
注意:當程式中有多個except block時,最多只有乙個except block會被執行,即最先匹配的block。
finally經常與try-except連用,表示無論發生什麼狀況,finally block中的**都會被執行,哪怕前面的try和except block中使用了return語句。
示例:檔案讀取
import sys
try:
f =open
('file.txt'
,'r').
...# some data processing
except oserror as err:
print
('os error: {}'
.format
(err)
)except
:print
('unexpected error:'
, sys.exc_info()[
0])finally
: f.close(
)
所以在finally中,經常會放一些無論如何都要執行的語句。
示例:
class
myinputerror
(exception)
:"""exception raised when there're errors in input"""
def__init__
(self, value)
:# 自定義異常型別的初始化
self.value = value
def__str__
(self)
:# 自定義異常型別的string表達形式
return
("{} is invalid input"
.format
(repr
(self.value)))
try:
raise myinputerror(1)
# 丟擲myinputerror這個異常
except myinputerror as err:
print
('error: {}'
.format
(err)
)
1、在程式中不確定某段**能否成功執行,則使用異常處理。
示例:json loads。
import json
raw_data = querydb(uid)
# 根據使用者的id,返回相應的資訊
data = json.loads(raw_data)
2、不可濫用異常處理。
示例:查詢字典中鍵對應的值。
d =
try:
value = d['dob']
...except keyerror as err:
print('keyerror: {}'.format(err))
使得**冗餘,且不易閱讀。因此對於flow-control(流程控制)的**邏輯,一般不用異常處理。此處可以使用條件語句或者使用get()方法。
if
'dob'
in d:
value = d[
'dob'
]#或者使用get()方法
d.get(
'dob'
,'null'
)
3、try block中有多處異常,只使用乙個try-except block。
示例:
try
: db = db.connect('')
# 可能會丟擲異常
raw_data = db.querydata('')
# 可能會丟擲異常
except
(dbconnectionerror, dbquerydataerror) err:
print
('error: {}'
.format
(err)
)
try
: db = db.connect('')
# 可能會丟擲異常
try:
raw_data = db.querydata('')
except dbquerydataerror as err:
print
('db query data error: {}'
.format
(err)
)except dbconnectionerror as err:
print
('db connection error: {}'
.format
(err)
)
兩者效果相同,但第一種效率更高,且更簡介,故選擇第一種。 python高階(異常處理)
python程式一旦發生錯誤,就從錯誤的位置停下來了,不會執行後面的內容。a 未定義的變數,nameerror print 我不會執行 該 不會執行 except nameerror try語句 異常 且 錯誤符合時執行 print 語法錯誤 else print try裡面 沒有錯誤時執行。pri...
Python高階 異常處理
就是不正常的情況,程式開發過程中錯誤和bug都是補充正常的情況 引發程式崩潰 try except 異常捕獲處理 try 1 可能發生異常的 except 2 發現異常後,立刻進入except,執行 2 else 3 程式正常執行進入這一行執行 finally 4 出現finally程式必定執行次行...
Python高階 異常處理
try except從句。將可能觸發異常產生的 放到try模組裡,而處理異常的 會在except語句塊裡實現。如 try file open test.txt rb except ioerror as e print an ioerror occured.format e.args 1 輸出 an ...