天天看點

python異常和錯誤的差別_Python中的異常和錯誤

一級目錄

異常機制的本質

異常指程式運作過程中出現的非正常現象,例如使用者輸入錯誤、除數為零、需要處理的檔案不存在、數組下标越界等。

所謂異常處理,就是指程式在出現問題時依然可以正确的執行剩餘的程式,而不會因為異常而終止程式執行

python異常和錯誤的差別_Python中的異常和錯誤

注:

橙色為常見異常錯誤,應予以重視

調試異常, 需要大量的經驗作為基礎

解決每一個遇到的異常, 建議大家遵循如下三點:

(1). 不慌張, 細看資訊, 定位錯誤。 看清楚報的錯誤資訊, 并定位發生錯誤的地方。

(2). 百度并檢視十個相關文章。 将異常類資訊進行百度, 至少檢視十個以上的相關文章。

(3). 以上兩步仍然無法解決, 找老師和同學協助解決。

異常解決的關鍵定位

當發生異常時, 解釋器會報相關的錯誤資訊, 并會在控制台列印出相關錯誤資訊。 隻需按照從上到下的順序即可追溯(Trackback) 錯誤發生的過程, 最終定位引起錯誤的那一

行代碼。

try…一個 except 結構

try…except 是最常見的異常處理結構。

try 塊包含着可能引發異常的代碼, except 塊則用來捕捉和處理發生的異常。 執行的時候, 如果 try 塊中沒有引發異常, 則跳過 ecept 塊繼續執行後續代碼; 執行的時候,

如果 try塊中發生了異常, 則跳過 try 塊中的後續代碼

跳到相應的 except 塊中處理異常; 異常處理完後

繼續執行後續代碼

#測試異常處理情況

try:

print('第一步')

a=1/0

print('第二部')

except BaseException as e: # BaseException as e的語句指明異常對象

print('第三步') #如果沒有異常的話改語句則跳過

print("結束")

循環輸入數字中用try except練習處理異常:

#測試

while True:

try:

x=int(input("請輸入一個整數:"))

print("您輸入的數字:",x)

if x==78:

print('退出程式')

break

except BaseException as e:

print("輸入的數字不是整型")

print(e)

print("輸入循環數字結束")

try…多個 except 結構

上面的結構可以捕獲所有的異常, 工作中也很常見。 但是, 從經典理論考慮, 一般建議盡量捕獲可能出現的多個異常(按照先子類後父類的順序) , 并且針對性的寫出異常處理代碼。 為了避免遺漏可能出現的異常, 可以在最後增加BaseException。

#try 多個except

try:

x=input('請輸入x的值:')

y=input("請輸入y的值:")

z=float(x)/float(y)

except ZeroDivisionError:

print('被除數不能為0')

except TypeError:

print('類型輸入錯誤')

except ValueError:

print('異常,字元串不能轉化為值')

except BaseException as e:

print(e)

try…except…else 結構

try…except…else 結構增加了“else 塊” 。 如果 try 塊中沒有抛出異常, 則執行 else 塊。 如果try 塊中抛出異常, 則執行 except 塊, 不執行 else 塊。

#try...except...else結構測試

try:

x=input('請輸入x的值:')

y=input("請輸入y的值:")

z=float(x)/float(y)

except BaseException as e:

print(e)

else:

print('商是',z)

try…except…finally 結構

try…except…finally 結構中, finally 塊無論是否發生異常

都會被執行

通常用來釋放 try 塊中申請的資源

#try...except...else結構測試

try:

x=input('請輸入x的值:')

y=input("請輸入y的值:")

z=float(x)/float(y)

except BaseException as e:

print(e)

else:

print('商是',z)

finally:

print('無論發生異常與否,都執行!')

print('運作結束')

#finally語句測試

try:

f=open('d:/dddd.txt',"r")

content=f.readline()

print(content)

except:

print('檔案不存在')

finally:

print('run in finally,關閉資源')

try:

f.close()

except BaseException as e:

print(e)

return 語句和異常處理問題

return語句

return 有兩種作用: 結束方法運作、 傳回值。

一般不把 return 放到異常處理結構中, 而是放到方法最後。

異常錯誤

Python 中的異常都派生自 BaseException 類,下面是一些常見異常的

ArithmeticError 所有數值計算錯誤的基類

AssertionError 斷言語句失敗

AttributeError 對象沒有這個屬性

BaseException 所有異常的基類

DeprecationWarning 關于被棄用的特征的警告

EnvironmentError 作業系統錯誤的基類

EOFError 沒有内建輸入,到達 EOF 标記

Exception 正常錯誤的基類

FloatingPointError 浮點計算錯誤

FutureWarning 關于構造将來語義會有改變的警告

GeneratorExit 生成器(generator)發生異常來通知退出

ImportError 導入子產品/對象失敗

IndentationError 縮進錯誤

IndexError 序列中沒有此索引(index)

IOError 輸入/輸出操作失敗

KeyboardInterrupt 使用者中斷執行(通常是輸入^C)

KeyError 映射中沒有這個鍵

LookupError 無效資料查詢的基類

MemoryError 記憶體溢出錯誤(對于 Python 解釋器不是緻命的)

NameError 未聲明/初始化對象 (沒有屬性)

NotImplementedError 尚未實作的方法

OSError 作業系統錯誤

OverflowError 數值運算超出最大限制

OverflowWarning 舊的關于自動提升為長整型(long)的警告

PendingDeprecationWarning 關于特性将會被廢棄的警告

ReferenceError 弱引用(Weak reference)試圖通路已經垃圾回收了的對象

RuntimeError 一般的運作時錯誤

RuntimeWarning 可疑的運作時行為(runtime behavior)的警告

StandardError 所有的内建标準異常的基類

StopIteration 疊代器沒有更多的值

SyntaxError Python 文法錯誤

SyntaxWarning 可疑的文法的警告

SystemError 一般的解釋器系統錯誤

SystemExit 解釋器請求退出

TabError Tab 和空格混用

TypeError 對類型無效的操作

UnboundLocalError 通路未初始化的本地變量

UnicodeDecodeError Unicode 解碼時的錯誤

UnicodeEncodeError Unicode 編碼時錯誤

UnicodeError Unicode 相關的錯誤

UnicodeTranslateError Unicode 轉換時錯誤

UserWarning 使用者代碼生成的警告

ValueError 傳入無效的參數

Warning 警告的基類

WindowsError 系統調用失敗

ZeroDivisionError 除(或取模)零 (所有資料類型)

with 上下文管理

finally 塊無論是否發生異常都會執行, 通常用于釋放資源的代碼。 其實, 還可以通過 with 上下文管理, 更友善的實作釋放資源的操作。

with 上下文管理可以自動管理資源, 在 with 代碼塊執行完畢後自動還原進入該代碼之前的現場或上下文。 不論何種原因跳出 with 塊, 不論是否有異常, 總能保證資源正常釋放。 極大的簡化了工作, 在檔案操作、 網絡通信相關的場合非常常用。

# with語句練習

with open("d:/bb.txt") as f:

for line in f:

print(line)

trackback 子產品

traceback子產品可以追蹤發生錯誤的程式,并列印在指定的檔案裡。

# traceback語句練習#

import traceback

try:

print('第一步')

a=1/0

except:

with open("d:/bb.txt","a") as f:

traceback.print_exc(file=f)

自定義異常類

自定義異常類一般都是運作時異常, 通常繼承 Exception 或其子類即可。 命名一般以 Error、 Exception 為字尾。

自定義異常

由 raise 語句主動抛出

#自定義錯誤

class AgeError(Exception):

def __init__(self,errorInfor):

Exception.__init__(self)

self.errorIfr=errorInfor

def __str__(self):

return str(self.errorInfor)+"年齡錯誤,應在1-150之間"

#########測試代碼#########

if __name__=="__main__":

age=int(input('請輸入年齡:'))

if age<1 or age>150:

raise AgeError(age)

else:

print('年齡為',age)

print('程式結束')

Pycharm 開發環境的調試

進行調試的核心是設定斷點。 程式執行到斷點時, 暫時挂起, 停止執行。 就像看視訊按下停止一樣, 我們可以詳細的觀看停止處的每一個細節。

斷點

程式運作到此處, 暫時挂起, 停止執行。 我們可以詳細在此時觀察程式的運作情況, 友善做出進一步的判斷。

初步認識調試操作界面

常見操作按鈕的含義:

python異常和錯誤的差別_Python中的異常和錯誤