定義
異常是一個事件焰络,并且這個異常事件在我們程序員的運行過程中出現(xiàn),會影響我們程序正常執(zhí)行符喝。
異常分類:
1. 語法錯誤導(dǎo)致的異常
2. 邏輯錯誤導(dǎo)致的異常
處理異常
- 如果錯誤發(fā)生的情況是可以預(yù)知的——使用流程控制進行預(yù)防處理
#比如: 兩個數(shù)字的運算闪彼,其中一個不是數(shù)字,運算就會出錯协饲。這時可以去判斷來預(yù)防
n2 = 3
if isinstance(n2,int):
res = 10+n2
print(res)
- 如果錯誤的發(fā)生條件不可預(yù)知——使用 try畏腕。。茉稠。except描馅。。 在錯誤發(fā)生時進行處理
'''語法:
try:
可能發(fā)生異常錯誤的代碼
except:
如果發(fā)生異常則進入 except 代碼塊進行處理
'''
# 假設(shè)讀取的文件不存在而线,會發(fā)生錯誤铭污,可以使用兩種方式進行處理,
# 1膀篮∴谀可以在文件讀取前先判斷當前的文件是否存在
# 2。也可以使用try 誓竿。磅网。。 except筷屡。知市。在錯誤發(fā)生時進行處理
try:
with open('./user.txt','r') as fp:
res = fp.read()
print(res)
except:
print('文件不存在')
print('程序的繼續(xù)執(zhí)行。速蕊。。')
注意:try娘赴。规哲。except。诽表。是在錯誤發(fā)生后進行的處理唉锌。和if有著根本性的區(qū)別。
Try——except——詳細用法
# 1竿奏。使用try袄简。。except 處理指定的異常泛啸。如果引發(fā)了非指定的異常绿语,則無法處理
try:
s1 = 'hello'
int(s1) # 會引發(fā) ValueError
except ValueError as e:
# except IndexError as e: #如果引發(fā)了非指定的異常,則無法處理
print(e)
# 2。 多分支處理異常類.不同的異常會走向不同的except處理
s1 = 'hello'
try:
# int(s1) # ValueError
s1[5] # IndexError
except IndexError as e:
print('IndexError',e)
except KeyError as e:
print('KeyError',e)
except ValueError as e:
print('ValueError',e)
# 3吕粹。通用異常類 Exception
s1 = 'world'
try:
int(s1)
except Exception as e:
print('Exception ===',e)
# 4. 多分支異常類+通用異常類.這樣引發(fā)異常后會按照從上往下的順序去執(zhí)行對應(yīng)的異常處理類种柑。
s1 = 'hello'
try:
# int(s1) # ValueError
s1[5] # IndexError
except IndexError as e:
print('IndexError',e)
except KeyError as e:
print('KeyError',e)
except ValueError as e:
print('ValueError',e)
except Exception as e:
print('Exception',e)
# 5。 try...except...else...
s1 = 'hello'
try:
str(s1)
except IndexError as e:
print('IndexError',e)
except ValueError as e:
print('ValueError',e)
except Exception as e:
print('Exception',e)
else:
print('try代碼塊中沒有引發(fā)異常時匹耕,執(zhí)行')
# 6聚请。try...except..else..finally
# finally 無論是否引發(fā)異常,都會執(zhí)行稳其。通常情況下用于執(zhí)行一些清理工作驶赏。
s1 = 'hello'
try:
int(s1)
print('如果前面的代碼引發(fā)了異常,這個代碼塊將不在繼續(xù)執(zhí)行既鞠。煤傍。')
except IndexError as e:
print('IndexError',e)
except ValueError as e:
print('ValueError',e)
except Exception as e:
print('Exception',e)
else:
print('try代碼塊中沒有引發(fā)異常時,執(zhí)行')
finally:
print('無論是否引發(fā)了異常损趋,都會執(zhí)行這個代碼塊')
print('如果上面的代碼有異常并且進行了處理患久,那么后面的代碼將繼續(xù)執(zhí)行')
# 7。使用 raise 浑槽,主動拋出異常
try:
#可以使用 raise 主動拋出異常蒋失,并設(shè)置異常信息
raise Exception('發(fā)生錯誤')
except Exception as e:
print('Exception',e)
#8。 assert 斷言
assert 1 == 1 # 如果后面的表達式正確桐玻,則什么也不做
assert 2 == 1 # 如果后面的表達式錯誤篙挽,則直接拋出 AssertionError
自定義異常日志處理類
class Myexception():
def __init__(self):
import traceback
import logging
# logging的基本配置
logging.basicConfig(
filename='./error.log',# 日志存儲的文件及目錄
format='%(asctime)s %(levelname)s \n %(message)s',# 格式化存儲的日志格式
datefmt='%Y-%m-%d %H:%M:%S'
)
# 寫入日志
logging.error(traceback.format_exc())
# 使用自定義異常處理類
try:
int('bb')
except:
print('在此處進行異常的處理')
Myexception() # 在異常處理的代碼塊中去調(diào)用自定義異常類