Python異常處理

雲崖先生發表於2020-06-24

異常

異常產生,檢測到錯誤且直譯器認為是異常,丟擲異常;異常處理,截獲異常,忽略或終止程式處理異常。
這裡寫圖片描述

首先給出兩個實驗txt檔案,內容如下:
這裡寫圖片描述
這裡寫圖片描述

try…except…
捕獲指定型別的異常
try:
    a
except NameError as e:   #捕獲NameError類的異常
    print('catch Error:',e)

print('exec over')

這裡寫圖片描述

b=0
try:
    b
except NameError as e:
    print('catch Error:',e)

print('exec over')

這裡寫圖片描述

捕獲所有型別的異常
try:
    undefvar   #之前沒定義過的變數
except:   #捕獲所有異常
    print('catch error')
#except Exception as e:
#Exception可以將所有的異常包括在內;將異常賦予變數e

這裡寫圖片描述

指定捕獲異常型別與實際觸發異常型別不同
try:
    undefvar   #之前沒定義過的變數
except FileNotFoundError as e:   #捕獲FileNotFoundError異常
    print('catch error',e)

這裡寫圖片描述

try:
    open('test1.txt')   #開啟之前不存在檔案
except FileNotFoundError as e:   #捕獲FileNotFoundError異常
    print('catch error',e)

這裡寫圖片描述

捕獲多種異常型別
try:
    f=open('one.txt')
    line=f.read(2)   #讀取檔案one.txt裡的前兩個字元
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)

這裡寫圖片描述

try…except…else…
try語句捕獲到異常執行except語句
try語句沒有捕獲到異常執行else語句
try:
    f=open('changeone.txt')
    line=f.read(2)   #讀取檔案changeone.txt裡的前兩個字元
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
else:
    print('No Error')

這裡寫圖片描述

try:
    f=open('changeone1.txt')
    line=f.read(2)   #讀取檔案changeone.txt裡的前兩個字元
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
else:
    print('No Error')

這裡寫圖片描述

try…finally…
如果try沒有捕獲到異常,先執行finally後的程式碼塊;
如果try捕獲到異常,先執行finally後的程式碼塊,由python直譯器處理捕獲到的異常

try-finally語句:無論是否檢測到異常,都會執行finally程式碼;不是為解釋異常而設計,主要是做一些清理工作,關閉檔案或釋放系統資源

try:
    f=open('one.txt')
    print(int(f.read()))
finally:
    print('close file')
    f.close()

這裡寫圖片描述

組合
try-except-finally

若try沒有捕獲到異常,執行完try程式碼塊後,執行finally
若try捕獲到異常,首先執行except處理錯誤,然後執行finally

try:
    ft=open('changeone.txt')
    line=ft.read(2)   #讀取檔案changeone.txt裡的前兩個字元
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
finally:
    print('close file')
    ft.close()

這裡寫圖片描述

try:
    ff=open('changeone1.txt')   #open時發生錯誤,f變數定義失敗
    line=ff.read(2)   
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
finally:
    print('close file')
    ff.close()

這裡寫圖片描述

try:
    ff=open('changeone1.txt')   #open時發生錯誤,f變數定義失敗
    line=ff.read(2)   
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
finally:
    try:
        print('close file')
        ff.close()
    except NameError as e:   #捕獲變數ff的錯誤
        print('NameError:,',e)

這裡寫圖片描述

try-except-else-finally

若try沒有捕獲到異常,執行完try程式碼段後,執行else程式碼段,最後執行finally
若try捕獲到異常,首先執行except處理錯誤,然後執行finally

try:
    feef=open('changeone.txt')   #open時正常讀入,沒發生錯誤
    line=feef.read(2)   
    numd=int(line)
    print('read num=%d' % numd)
except FileNotFoundError as e:
    print('catct FileNotFoundError',e)
except ValueError as e:
    print('ValueError',e)
else:
    print('No Error')
finally:
    try:
        print('close file')
        feef.close()
    except NameError as e:
        print('NameError:,',e)

這裡寫圖片描述

with語句
with語句,作用等同於try-except-finally語句的
import os
try:
    with open('one.txt') as fw:
        print('in with fw.read:',fw.read())
        fw.seek(-5,os.SEEK_SET)   #出現異常
except ValueError as e:
    print('in with catch ValueError:',e)
    print('with:',fw.closed)

這裡寫圖片描述

這裡寫圖片描述