高階語言通常都配置了一套try...except...finally的錯誤處理機制。
1、我們先看乙個try的機制
try:
res=1/0
except zerodivisionerror as e:
print("出錯了,除數不能為0",e)
執行結果為:
出錯了,除數不能為0 division by zero
當我們認為某些**可能會出錯時,就可以用try來執行這段**,如果只選出錯,則後續**不會執行
而是直接跳轉至錯誤處理**,即except語句塊
2、另外乙個例子:
l=dic={}
try:
print(dic['name'])
print(l[-1])
except keyerror as e:
print('字典key不存在',e)
except indexerror as e:
print("出錯了,下標越界",e)
except exception as e:#捕捉所有的異常
print("未知異常",e)
else:
print("沒有出現異常...")
finally:#不管出現 異常和不出現異常,都會執行
print("什麼時候執行finally")
輸出結果:
字典key不存在 'name'
什麼時候執行finally
key不存在,我們就丟擲乙個keyerror的錯誤,下標越界,我們就丟擲乙個indexerror的錯誤
如果沒有錯誤,就在except語句塊後面加乙個else,當沒有錯誤發生時,就自動執行else
finally是不管什麼時候都執行的語句
3、記錄錯誤
如果不捕獲錯誤,自然可以讓python直譯器來列印出錯誤堆疊,但是程式也被結束了,既然我們能捕獲錯誤,就
可以把錯誤列印出來,然後分析錯誤,同時讓程式執行下去
python內建的loging模組可以記錄錯誤
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except exception as e:
logging.exception(e)
main()
print('end')輸出結果
enderror:root:division by zero
traceback (most recent call last):
file "c:/users/zyq64/pycharmprojects/1018/day10/記錄錯誤.py", line 12, in main
bar('0')
file "c:/users/zyq64/pycharmprojects/1018/day10/記錄錯誤.py", line 8, in bar
return foo(s) * 2
file "c:/users/zyq64/pycharmprojects/1018/day10/記錄錯誤.py", line 5, in foo
return 10 / int(s)
zerodivisionerror: division by zero
同樣是出錯,但是程式列印完錯誤資訊後會繼續執行,並正常退出
4、主動丟擲錯誤 raise
try:
10 / 0
except zerodivisionerror:
raise valueerror('input error!')
輸出結果:
traceback (most recent call last):
file "c:/users/zyq64/pycharmprojects/1018/day10/異常處理.py", line 38, in
10 / 0
zerodivisionerror: division by zero
during handling of the above exception, another exception occurred:
traceback (most recent call last):
file "c:/users/zyq64/pycharmprojects/1018/day10/異常處理.py", line 40, in
raise valueerror('input error!')
valueerror: input error!
陣列下標越界
原理 因為c語言不會檢測陣列下標,所以如果我們給陣列乙個超出它大小的下標,就會照成陣列越界。如果是想陣列中寫入資料的話,就會造成資料寫入到不屬於陣列的地方,或者說如果讀取資料的話,就會讀取到別的地方的資料。因為陣列位址是自低往高增長,而棧的位址是自高向下降低,所以如果我們將陣列下標根據棧內的空間的分...
C陣列下標越界
之前總聽說c語言的各種毛病,今天算是遇到乙個 陣列下標越界 兩段完成不相干的 一段是測溫度的,一段是測轉速的。兩段 單獨執行都沒有問題,但是若執行測轉速的 測溫度的資料就會發生錯誤。一步檢視,發現執行測轉速之後,測溫度的 中的乙個變數和乙個資料的值就會發生詭異的錯誤 陣列下標越界 這個越界非常不明顯...
python字串下標越界 Python 字串
str1 abcdef 字串 str型 int1 1 整數 int型 float1 1.3 浮點數,float型 str2 abcdef 單引號和雙引號都可以表示字串 print str1,str2 在某一行按下ctrl 就可以進行注釋,注釋就是程式不執行該行 注釋是給人看的,而不是給程式看的 pr...