網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
繼續(xù)更新Python基礎(chǔ)語(yǔ)法,到目前為止Python基礎(chǔ)語(yǔ)法已經(jīng)接近了尾聲,本次錯(cuò)誤與異常處理更新完后會(huì)對(duì)文件、數(shù)據(jù)庫(kù)、包管理、模塊管理、正則表達(dá)式的使用進(jìn)行更新。完成這幾個(gè)大致的任務(wù)之后將會(huì)更新爬蟲(chóng)與數(shù)據(jù)分析。本專欄所寫(xiě)的東西非常的適用初學(xué)者,當(dāng)然也非常適合老手,每一部分都有很全面的編程技巧。相信大家看完后會(huì)感覺(jué)受益匪淺。(文末附有常見(jiàn)異常表)
異常與錯(cuò)誤的概念
錯(cuò)誤顧名思義就是由于某種原因,產(chǎn)生了不符合我們預(yù)期的結(jié)果。我們的代碼在運(yùn)行時(shí)非常的有可能出現(xiàn)錯(cuò)誤,我們有時(shí)又稱這種現(xiàn)象為BUG,在Python中異常通常指的是我們的Python解釋器發(fā)現(xiàn)了我們程序中存在的錯(cuò)誤,自己無(wú)法解決該錯(cuò)誤的時(shí)候向操作系統(tǒng)提出了報(bào)告引發(fā)程序中斷。正如現(xiàn)實(shí)中我們個(gè)人犯錯(cuò)而監(jiān)管我們的人發(fā)現(xiàn)我們的錯(cuò)誤,發(fā)現(xiàn)我們的異常舉動(dòng)并進(jìn)行處理。及時(shí)幫我們糾正錯(cuò)誤行為。
錯(cuò)誤分類
語(yǔ)法錯(cuò)誤
語(yǔ)法錯(cuò)誤又稱為編譯錯(cuò)誤,是計(jì)算機(jī)操作系統(tǒng)在執(zhí)行你的代碼的時(shí)候,由于你代碼存在語(yǔ)法性問(wèn)題無(wú)法開(kāi)始執(zhí)行程序?qū)е碌腻e(cuò)誤,一般就是函數(shù)名、關(guān)鍵字用錯(cuò)導(dǎo)致或者進(jìn)行導(dǎo)包的時(shí)候?qū)肓瞬淮嬖诘陌?。隨著編譯器的迭代更新不斷變強(qiáng),這種錯(cuò)誤已經(jīng)非常少見(jiàn)了。Python中編譯錯(cuò)誤提示SyntaxErrorl例如下圖(缺少一半括號(hào)):
運(yùn)行時(shí)錯(cuò)誤
運(yùn)行時(shí)錯(cuò)誤指的是程序通過(guò)了編譯,計(jì)算機(jī)操作系統(tǒng)開(kāi)始執(zhí)行你的程序在代碼執(zhí)行過(guò)程中出由于編程者的疏忽,產(chǎn)生了代碼之間的矛盾導(dǎo)致的錯(cuò)誤。例如:沒(méi)有考慮到數(shù)組邊界或者變量范圍導(dǎo)致數(shù)組越界、零除異常...這種錯(cuò)誤會(huì)導(dǎo)致你的程序突然就掛掉一定情況下會(huì)造成灰常大的損失。例如以下情況:
邏輯錯(cuò)誤
這種錯(cuò)誤往往是人們最煩惱的錯(cuò)誤,因?yàn)椴僮飨到y(tǒng)不會(huì)直接拋出異常給我們看,你的程序也可以正常運(yùn)行,但是對(duì)程序輸入值之后得到的結(jié)果就是不對(duì)。非常的氣人,我們能改進(jìn)這種錯(cuò)誤的方式就是baidu、動(dòng)腦思考、進(jìn)行調(diào)試、實(shí)在不行找個(gè)老鳥(niǎo)幫你看看。常見(jiàn)的錯(cuò)誤有:死循環(huán)、表達(dá)式錯(cuò)誤、局部全局變量混用....
異常處理機(jī)制
捕獲異常并處理
Python中采用了結(jié)構(gòu)化的異常處理機(jī)制我們可以通過(guò)try對(duì)異常進(jìn)行捕獲,然后在except中進(jìn)行異常的處理。最后在finally中進(jìn)行資源釋放之類的工作(有沒(méi)有異常finally中的代碼都會(huì)執(zhí)行),與其他語(yǔ)言不同的是,在Python中引入了一個(gè)else機(jī)制,else中的語(yǔ)句只有在try中的代碼沒(méi)有異常的時(shí)候才會(huì)執(zhí)行。有異常就不執(zhí)行。詳細(xì)操作見(jiàn)下面代碼,正如所見(jiàn),可以對(duì)多個(gè)類型的異常進(jìn)行捕獲。對(duì)多個(gè)異常進(jìn)行捕獲的話需要將類型涵蓋范圍較小的異常放在前面,而在捕獲之前一般由try代碼塊中的代碼或者函數(shù)進(jìn)行異常的拋出
# 異常的捕獲
a=int(input('輸入除數(shù):'))
b=int(input('輸入被除數(shù):'))
try:
res=a/b
except ZeroDivisionError:
print('除數(shù)不可以為0')
# 相同處理方式的異??梢赃@么寫(xiě)
except (BaseException,TypeError):
print('有錯(cuò)誤')
else:
print('您的結(jié)果為',res)
finally:
print('感謝使用!')
主動(dòng)拋出異常
我們可以輕松的進(jìn)行異常的捕獲并進(jìn)行解決。但是有時(shí)候我們有一種需求就是將錯(cuò)誤拋出給上一層進(jìn)行處理。這時(shí)候主動(dòng)拋出異常就登場(chǎng)了。在Python中主動(dòng)拋出異常使用的是raise關(guān)鍵字。raise關(guān)鍵字一般與自定義異常類一塊進(jìn)行使用,所以大家先記住raise是主動(dòng)拋出異常的關(guān)鍵字,待會(huì)到自定義異常類處看代碼即可。
斷言處理
斷言處理使用語(yǔ)法為:assert <布爾表達(dá)式>或者assert <布爾值表達(dá)式> , <字符串表達(dá)式>。assert會(huì)先對(duì)布爾值表達(dá)式進(jìn)行判斷,如果表達(dá)式為T(mén)rue就不進(jìn)行操作,否則會(huì)拋出異常。并在拋出的異常中輸出字符串表達(dá)式的信息。具體操作可以看以下代碼:
'''
3 錄入一個(gè)學(xué)生的成績(jī),把該學(xué)生的成績(jī)轉(zhuǎn)換為A優(yōu)秀、B良好、C合格、D不及格的形式,
最后將該學(xué)生的成績(jī)打印出來(lái)。要求使用assert斷言處理分?jǐn)?shù)不合理(小于0或者大于100)的情況
請(qǐng)編寫(xiě)程序。
'''
n=int(input())
assert n in range(101),"您輸入的成績(jī)不合理!"
if n>=85:
print("優(yōu)秀!")
elif n>=70:
print("良好!")
elif n>=60:
print("合格!")
else:
print("不及格!")
自定義異常類
Python官方庫(kù)中提供了一系列的異常處理類,在Python中所有的異常均由類實(shí)現(xiàn),所有的異常類又繼承自BaseException類,程序運(yùn)行時(shí)出現(xiàn)的異常大多繼承自Exception類。Python支持自定義異常類。自定義異常類一般繼承Exception或者其子類名稱一般以Exception或者Error命名。
自定義異常類以及主動(dòng)拋棄異常
'''
自己定義一個(gè)異常類,繼承Exception類, 捕獲下面的過(guò)程:判斷input()輸入的字符串長(zhǎng)度是否小于5,
如果小于5,比如輸入長(zhǎng)度為3則輸出:"The input is of length 3, expecting at least 5“,
大于5則輸出"success”。
'''
class StrLenError(Exception):
def __init__(self,s):
Exception.__init__(self,s)
self.s =s
def __str__(self):
return f"The input is of length {len(self.s)}, expecting at least 5"
n=input()
if len(n)<=5:
raise StrLenError(n)
else:
print("success")
常見(jiàn)異常及釋義
以下是一些常見(jiàn)的類及引發(fā)該類異常的錯(cuò)誤描述:
類名 | 描述 |
---|---|
SyntaxError | 發(fā)生語(yǔ)法錯(cuò)誤時(shí)引發(fā) |
FileNotFoundError | 未找到指定文件或目錄時(shí)引發(fā) |
NameError | 找不到指定名稱的變量時(shí)引發(fā) |
ZeroDivisionError | 除數(shù)為0時(shí)的異常 |
IndexError | 當(dāng)使用超出列表范圍的索引時(shí)引發(fā) |
KeyError | 當(dāng)使用映射不存在的鍵時(shí)引發(fā) |
AttributeError | 當(dāng)嘗試訪問(wèn)未知對(duì)象屬性時(shí)引發(fā) |
TypeError | 當(dāng)試圖在使用a類型的場(chǎng)合使用b類型時(shí)引發(fā) |
附:用戶自定義異常實(shí)例
你可以通過(guò)創(chuàng)建一個(gè)新的異常類來(lái)?yè)碛凶约旱漠惓!.惓n惱^承自 Exception 類,可以直接繼承,或者間接繼承,例如:
>>> class NewError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
>>> try:
raise NewError(2*2)
except NewError as e:
print('New exception occurred, value:', e.value)
My exception occurred, value: 4
>>> raise NewError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.NewError: 'oops!'
在這個(gè)例子中,類 Exception 默認(rèn)的 init() 被覆蓋。
當(dāng)創(chuàng)建一個(gè)模塊有可能拋出多種不同的異常時(shí),一種通常的做法是為這個(gè)包建立一個(gè)基礎(chǔ)異常類,然后基于這個(gè)基礎(chǔ)類為不同的錯(cuò)誤情況創(chuàng)建不同的子類:
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多數(shù)的異常的名字都以"Error"結(jié)尾,就跟標(biāo)準(zhǔn)的異常命名一樣。
總結(jié)
原文鏈接:https://blog.csdn.net/apple_51931783/article/details/124618286
相關(guān)推薦
- 2022-10-21 React封裝全屏彈框的方法_React
- 2022-11-03 C#如何給新建的winform程序添加資源文件夾Resources_C#教程
- 2022-10-30 C++中線程池ThreadPool源碼解析_C 語(yǔ)言
- 2022-07-01 使用python實(shí)現(xiàn)簡(jiǎn)單去水印功能_python
- 2022-05-09 python面向?qū)ο缶幊淘O(shè)計(jì)原則之單一職責(zé)原則詳解_python
- 2023-11-20 python設(shè)置matplotlib.plot的坐標(biāo)刻度和坐標(biāo)范圍
- 2022-03-30 python生成密碼字典詳解_python
- 2022-05-31 Python中的字典及其使用方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支