Python 異常和日誌

2021-08-20 23:39:54 字數 4934 閱讀 9152

一 異常

1 異常

異常通常可以看做是程式的錯誤,代表程式是有缺陷的。

異常型別

異常 描述

baseexception 所有異常的基類

systemexit 直譯器請求退出

exception 常規錯誤的基類

stopiteration 迭代器沒有更多的值

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

floatingpointerror 浮點計算錯誤

overflowerror 數值運算超出最大限制

zerodivisionerror 除(或取模)零 (所有資料型別)

attributeerror 物件沒有這個屬性

eoferror 沒有內建輸入,到達eof 標記

environmenterror 作業系統錯誤的基類

ioerror 輸入/輸出操作失敗

oserror 作業系統錯誤

windowserror 系統呼叫失敗

importerror 匯入模組/物件失敗

2 異常處理

在python中,可以使用try語句檢查異常,任何在try語句塊裡的**都會被檢測。try語句主要有兩種型別:try-except和try-finally。

異常處理並不僅僅處理那些直接發生在try子句中的異常,而且還能處理子句中呼叫的函式(甚至間接呼叫的函式)裡丟擲的異常。

try-except

def

yichang

(list):

print(list[len(list)])

list1 = [0, 1, 2, 3]

defgetexpection

():try:

ch=yichang(list1)

except indexerror as s:

print(s)

print('列表索引超出範圍')

getexpection()

結果:

list index out of range

列表索引超出範圍

乙個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有乙個分支會被執行。

處理程式將只針對對應的try子句中的異常進行處理,而不是其他的 try 的處理程式中的異常。

乙個except子句可以同時處理多個異常,這些異常將被放在乙個括號裡成為乙個元組

例如:

except (runtimeerror, typeerror, nameerror):

pass

在except子句還可以寫入else語句。在try子句執行時沒有發生異常,python將執行else語句後的語句(可選),然後控制流通過整個try語句。

try:

1/1except zerodivisionerror:

print('除數為0的異常')

else:

print('tr無異常y語句')

結果:

tr無異常y語句

使用 else 子句比把所有的語句都放在 try 子句裡面要好,這樣可以避免一些意想不到的、而except又沒有捕獲的異常。

try-finally

不管 try 子句裡面有沒有發生異常,finally 子句都會執行。

格式:try-except-finally 和try-except-else-finally

def

yichang

(list):

print(list[len(list)])

list1 = [0, 1, 2, 3]

defgetexception

():try:

ch=yichang(list1)

except indexerror as s:

print(s)

print('列表索引超出範圍')

finally:

print('finally。。。。。。')

getexception()

結果:

list index out of range

列表索引超出範圍

finally。。。。。。

另外,當try語句中有return語句的時候,會檢查是否有finally語句,若有,會先執行finally語句,在執行return。同理,try語句中有exit()也一樣。

3 丟擲異常

python 使用 raise 語句丟擲乙個指定的異常。

raise 唯一的乙個引數指定了要被丟擲的異常。它必須是乙個異常的例項或者是異常的類(也就是 exception 的子類)。

如果你只想知道這是否丟擲了乙個異常,並不想去處理它,那麼乙個簡單的 raise 語句就可以再次把它丟擲。

try:

raise nameerror('hithere')

except nameerror:

print('an exception flew by!')

raise

結果:

an exception flew by!

traceback (most recent call last):

file 「」, line 2, in ?

nameerror: hithere

自定義異常

可以通過建立乙個新的異常類來擁有自己的異常。異常類繼承自 exception 類,可以直接繼承,或者間接繼承。

當建立乙個模組有可能丟擲多種不同的異常時,一種通常的做法是為這個包建立乙個基礎異常類,然後基於這個基礎類為不同的錯誤情況建立不同的子類

class

***exception

(exception):

pass

defdo***

(): ***=input("請輸入性別:")

if ***!='男'

and ***!='女':

raise ***exception("性別只能為男或女")

try:

do***()

except ***exception as se:

print(se)

結果:

請輸入性別:我

性別只能為男或女

日誌是一種可以追蹤某些軟體執行時所發生事件的方法。軟體開發人員可以向所寫的**中呼叫日誌記錄相關的方法來表明發生了某些事情。乙個事件可以用乙個可包含可選變數資料的訊息來描述。此外,事件也有重要性的概念,這個重要性也可以被稱為嚴重性級別(level)。

不同的應用程式所定義的日誌等級可能會有所差別,分的詳細點的會包含以下幾個等級:

debug 最詳細的日誌資訊

info 資訊詳細程度僅次於debug,通常只記錄關鍵節點資訊

notice

warning 當某些不期望的事情發生時記錄的資訊(警告)

error 由於乙個更嚴重的問題導致某些功能不能正常執行時記錄的資訊

critical 當發生嚴重錯誤,導致應用程式不能繼續執行時記錄的資訊

alert

emergency

logging模組定義的函式和類為應用程式和庫的開發實現了乙個靈活的事件日誌系統。logging模組是python的乙個標準庫模組,由標準庫模組提供日誌記錄api的關鍵好處是所有python模組都可以使用這個日誌記錄功能。

說明:

1 上面列表中的日誌等級是從上到下依次公升高的,即:debug < info < warning < error < critical,而日誌的資訊量是依次減少的。

2 logging模組也可以指定日誌記錄器的日誌級別,只有級別大於或等於該指定日誌級別的日誌記錄才會被輸出,小於該等級的日誌記錄將會被丟棄。

import logging

# 日誌輸出格式 時間 日誌級別 日誌資訊

log_format = "%(asctime)s - %(levelname)s - %(message)s"

# 日誌儲存檔名

logging.basicconfig(filename='aaa.txt',level=logging.debug,format=log_format)

deftest

():try:

a=int(input("請輸入乙個被除數:"))

b=int(input("請輸入乙個除數:"))

print(a/b)

return

except (valueerror):

#處理異常

logging.debug("只能輸入數字!")

except zerodivisionerror:

logging.info("除數不能為0")

else:

print("else...")

finally:

print("程式結束")

test()

結果:

請輸入乙個被除數:1

請輸入乙個除數:0

除數不能為0

程式結束

同時也會在和當前路徑下,建立乙個文件名為aaa的文件記錄該事件。內容如下:

2018-06-26 11:38:48,669 - info - 除數不能為0

python日誌和異常

異常 try except異常型別,捕獲異常 處理異常 也可以巢狀 除了。except exception as xx 未知錯誤。如果之前的都沒有,就抓所有 else 沒有錯誤 可以寫入多個except 捕獲異常 except 異常型別 as xx 具體的異常資訊物件 執行了乙個異常後不會繼續執行下...

python日誌和異常

日誌 異常 2.異常 try捕獲由python或程式本身引發的異常 raise 手工地引發乙個異常 為什麼要使用異常 錯誤處理,當python檢查以程式執行時的錯誤就引發異常,你可以在程式裡捕捉和處理這些錯誤,或者忽略它們。事件通知,異常也可以作為某種條件的訊號,而不需要在程式裡傳送結果標誌或顯式地...

異常和日誌

class excption exception 自定義異常類 pass try input 請輸入性別 if 男 and 女 raise exception 性別只能是男或女 except excption as ex print ex except exception as ex print e...