Python高階系列 5 異常處理

2021-10-25 09:42:13 字數 4019 閱讀 6962

三、注意事項

錯誤:**不符合規範,無法被識別和執行。

異常:程式語法正確,可以被執行,但是執行過程中遇到了錯誤,丟擲異常。

示例:

#缺少冒號,錯誤

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 ...