07-Python異常處理

什麼是異常?

Python無法正常處理程序時就會發生一個異常,這時Python就會拋出一個對象,表示這是一個錯誤。

必須處理異常,否則程序可能會停止運行,或者出現異常現象。

:4/0就會拋出異常,因爲除數不可以爲0。
:a=[1,2,3],訪問a[10]就會拋出異常,因爲下標超出了範圍(0~2)。

示例:

a=[1,2,3]
print(a[10])

拋出異常:

在這裏插入圖片描述


常見異常

ImportError           # 引入模塊錯誤,大部分是路徑問題或名稱錯誤。
ModuleNotFoundError   # 模塊不存在
IOError               # 輸入輸出異常,大部分是無法打開文件
FileNotFoundError     # 文件不存在
KeyError              # 訪問字典裏不存在的鍵
ZeroDivisionError     # 除(或取模)零
NameError             # 變量未定義
TypeError             # 實參的類型與要求的不符(如time.sleep("1"))
ValueError            # 實參的值與要求的不符,即使類型正確(如int("one"))
IndexError            # 下標越界

小貼士:

Python中存在許許多多的異常,具體情況具體處理。


捕獲並處理異常

程序拋出異常後,可能會停止運行。因爲程序畢竟是程序,不夠智能,並不會處理它們。

程序會根據不同的情況,拋出不同的異常。

需要捕獲相應的異常並進行處理,程序纔會正常的運行下去。

綜上所述,提前用代碼告知Pyton,出現各種異常該如何處理。

try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print("文件打開失敗:",fileNotFoundError)
except:             #其他錯誤
    print("其他錯誤")

解釋:

  • 在try語句塊中執行可能發生錯誤的代碼
  • 使用except來捕獲異常
  • FileNotFoundError是異常名,表示文件不存在
  • fileNotFoundError爲對象名,可自定義,通過此對象來處理異常
  • 當文件不存在,異常就會被fileNotFoundError捕獲
  • 出現其他錯誤,就會輸出:其他錯誤

手動拋出異常

手動拋出異常,再捕獲異常,進行處理。
如:需要用戶輸入數字,用戶卻輸入了字符

age=input("請輸入年齡:")
if not age.isdigit():
    raise ValueError("值錯誤")

若發生異常:

在這裏插入圖片描述

若沒有發生異常:

在這裏插入圖片描述

解釋:

  • 使用關鍵字raise拋出異常
  • 拋出異常ValueError
  • 上例沒有對異常進行捕獲處理,只是拋出。
  • 有些異常發生時,程序不會停止運行,如ValueError(退出碼爲0)
手動拋出異常,並捕獲、處理異常:
try:
    age=input("請輸入年齡:")
    if not age.isdigit():
        raise ValueError("值錯誤")
except ValueError as valueError:
    print(valueError)
    exit(1)

若發生異常:

在這裏插入圖片描述

若沒有發生異常:

在這裏插入圖片描述


自定義異常

  • 所有的異常都是Exception或Exception的子類
  • 繼承Exception,成爲它的子類,即爲自定義異常。
class MyError(Exception):       #繼承了Exception
    def __init__(self,value):   #構造函數
        	self.value=value
    def __str__(self):          #強制轉換
       	return str(self.value)
try:
    raise MyError("我的錯誤")    #拋出異常
except MyError as myError:      #捕獲異常
    print(myError)                #處理異常

try-else

  • 當try塊中沒有發生異常,就會執行else語句塊
try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print(fileNotFoundError)
else:
    print("沒有發生錯誤")

try-finally

  • 無論是否發生異常都將執行finally語句塊
try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print(fileNotFoundError)
finally:
    print("無論是否異常,都會輸出")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章