python異常捕獲處理


一、異常處理

在程序運行過程中,總會遇到各種各樣的錯誤。程序一旦出錯就停止運行了,此時就需要捕捉異常,通過捕捉到的異常,我們再去做對應的處理

寫一個函數,實現除法運算

def calc(a,b):
  return a/b

print(calc(5,1))#調用,沒有錯誤,結果是5.0
>>> 5.0

print(calc(5,0))#再次調用,這時候就不對了,因為被除數不能為0,下面報了一堆錯,程序停止運行了
>>> ZeroDivisionError: division by zero

 

這個時候我們就需要捕捉異常了,如果除數是0的話,就提示用戶傳入的參數不對,重新傳入。

捕捉異常使用try....except....關鍵字,就是你在寫代碼的時候,先要考慮到這段代碼可能會出現什么樣的錯誤,然后做對應的處理,try里面就是包含你做處理的代碼,except里面就是出了某種錯誤的時候,我怎么去處理,下面我們改下代碼,捕捉異常

def calc(a, b):
try:
res = a / b
except ZeroDivisionError as e: # 如果是除數為0的錯誤,就返回除數不能為0,這個as e代表把返回錯誤的信息賦給e
return '除數不能為0!'
return res # 這個是如果沒有這個異常的話,就返回結果

print(calc(5, 0)) # 這樣再調用就不會出來錯誤了,就返回除數不能為0這個了。

 

上面就是捕捉異常,當然上面的只能捕捉到除數為0的錯誤,如果有別的錯誤就捕捉不到了;還有一個finally的用法,就是不管出不出異常都執行;try還有一個可以捕捉所有異常,還有else的用法,就是沒出異常的時候怎么辦,下面用代碼來解釋

def calc(a, b):
try: # 捕捉異常
res = a / b
except ZeroDivisionError as e:
return '除數不能為0!'
except KeyError as e: # 捕捉KeyError這個異常,當然這段代碼沒用到字典,所以不會有keyerror這個錯誤,我只是舉個例子
return 'keyerror錯誤'
except Exception as e: # 這個是捕捉所有的異常,不管你有什么異常都可以捕捉到
print('其他異常')
return e # 返回錯誤信息
else: # 這個else和上面的try對應的,也就是不出異常的話走這里
print('沒有出異常')
return res
finally: # 這個finally是不管這個段代碼有沒有出異常都走它
print('出沒出異常都走我這里')

print(calc(5, 0)) # 出除數異常了,會返回除數不能為0!和執行finally里面的代碼
print(calc(5, 1)) # 這個沒有出異常,就會走else里面的東西,返回結果,也會執行執行finally里面的代碼
print(calc(5, 's')) # 這個也走異常了,除數是字符串,肯定不能除,就走那個捕捉所有異常的代碼了,也會執行執行finally里面的代碼

 

 

二、常見的一些異常信息
AttributeError: 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性x
IOError:輸入/輸出異常,一般是無法打開文件
ImportError: 無法導入模塊或包,一般是路徑問題或名稱錯誤
IndentationError:代碼沒有正確對齊,屬於語法錯誤
IndexError:下標索引超出序列邊界,比如x只有三個元素,卻試圖訪問x[3]
KeyError:試圖訪問字典里不存在的鍵
KeyboardInterrupt:Ctrl+C被按下
NameError:使用一個還未被賦予對象的變量
SyntaxError: 語法錯誤
TypeError: 傳入對象類型與要求的不符
UnboundLocalError:試圖訪問一個還未被設置的局部變量,一般是由於在代碼塊外部還有另一個同名變量
ValueError: 傳入一個調用者不期望的值,即使值的類型是正確的

 

注:本文摘自http://www.nnzhp.cn/archives/146


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM