python如何主動拋出異常和捕獲異常
1. 如何拋出異常?
異常的產(chǎn)生有兩種來源:
一種是程序自動拋出,比如 1/0
會自動拋出 ZeroDivisionError
一種是開發(fā)者主動拋出,使用 raise
關鍵字拋出。
在 Python 中是使用 raise
關鍵字來拋出異常的,比如在下面這個函數(shù)中,如果不存在目標文件,則會拋出一個 Exception 通用異常。
def demo_func(filename):
if not os.path.isfile(filename):
raise Exception
2. 如何捕獲異常?
出現(xiàn)錯誤或者異常沒有關系,關鍵在于你要學會預判程序可能會出現(xiàn)的錯誤或異常,然后在代碼中捕獲這些異常并處理。
異常的捕獲的語法有如下四種:
第一種語法
只捕捉但是不想獲取異常信息
try:
代碼A
except [EXCEPTION]:
代碼B
第二種語法
不但捕捉了還要獲取異常信息,賦值給 e 后,后面你可以把異常信息打印到日志中。
try:
代碼A
except [EXCEPTION] as e:
代碼B
第三種語法
使用 try ... except ... else
如果代碼A發(fā)生了異常,則會走到代碼B的邏輯,如果沒有發(fā)生異常,則會走到代碼C
try:
代碼A
except [exception] as e:
代碼B
else:
代碼C
舉個例子
不發(fā)生異常的情況
>>> try:
... 4/2
... except ZeroDivisionError as e:
... print("發(fā)生了異常:錯誤信息如下: \n" + str(e))
... else:
... print("程序正常運行")
...
2
程序正常運行
發(fā)生異常的情況
>>> try:
... 1/0
... except ZeroDivisionError as e:
... print("發(fā)生了異常:錯誤信息如下: \n" + str(e))
... else:
... print("程序正常運行")
...
發(fā)生了異常:錯誤信息如下:
integer division or modulo by zero
第四種語法
使用 try ... except ... finally
如果代碼A發(fā)生了異常,則會走到代碼B的邏輯,最后不管有沒有發(fā)生異常都會走到代碼C
try: 代碼A except [exception] as e: 代碼B finally: 代碼C
舉個例子
發(fā)生異常的情況
>>> try:
... 1/0
... except ZeroDivisionError as e:
... print("發(fā)生了異常:錯誤信息如下: \n" + str(e))
... finally:
... print("程序運行結束!!")
...
發(fā)生了異常:錯誤信息如下:
integer division or modulo by zero
程序運行結束!!
不發(fā)生異常的情況
>>> try:
... 4/2
... except ZeroDivisionError as e:
... print("發(fā)生了異常:錯誤信息如下: \n" + str(e))
... finally:
... print("程序運行結束!!")
...
2
程序運行結束!!
3. 捕獲多個異常?
每個except捕獲一個異常
一個 try 語句可能有多個 except 子句,以指定不同異常的處理程序,但是最多會執(zhí)行一個處理程序。
當代碼 A 在運行中拋出了異常時,Python 解釋器會逐行運行代碼,如果拋出的異常是 exception1
那么后面直接運行代碼B,運行完 B 后,就不會再判斷后面兩個 except 語句了。
而如果不是 exception1
,而是 exception2
,那會運行代碼C,而不會再運行第三個 except 語句了。
try:
代碼A
except [exception1] as e:
代碼B
except [exception2] as e:
代碼C
except [exception3] as e:
代碼D
舉個例子吧,下面這段代碼,由于 1/0
會拋出 ZeroDivisionError
錯誤,所以前面兩個異常匹配都不成功,而在最后一個 except 成功匹配上,最終打印出 除數(shù)不能為 0
try:
1/0
except IOError:
print("IO讀寫出錯")
except FloatingPointError:
# 浮點計算錯誤
print("計算錯誤")
except ZeroDivisionError:
# 除數(shù)不能為 0
print("計算錯誤")
# output: 計算錯誤
一個except捕獲多個異常
上面的例子可以看出來,第二個異常和第三個異常是屬于同一類,就是 計算錯誤
,異常處理的代碼是一樣的,那有沒有辦法將它們合并在一起呢,簡化一下代碼呢?
答案是,可以的。
在 except 后面其實是可以接多個異常的,多個異常之間使用括號包裹。只要匹配上一個就算捕獲到,就會進入相應的代碼分支。
try:
1/0
except IOError:
print("IO讀寫出錯")
except (ZeroDivisionError, FloatingPointError):
print("計算出錯")
# output: 計算錯誤
審核編輯:符乾江
-
python
+關注
關注
56文章
4809瀏覽量
85071 -
異常
+關注
關注
0文章
23瀏覽量
9270
發(fā)布評論請先 登錄
相關推薦
電路異常現(xiàn)象及解決
![電路<b class='flag-5'>異常</b>現(xiàn)象及解決](https://file1.elecfans.com/web3/M00/07/5E/wKgZPGelbB6ARiW2AAATB2cuQO8336.png)
SMT貼片空焊異常
串口通訊異常處理方法 串口設備連接方式
單片機異常復位的原因
嵌入式C編程常用的異常錯誤處理
三菱異常停止plc怎么解決
ESP8266使用mDNS后,ESP會拋出異常怎么解決?
一站式統(tǒng)一返回值封裝、異常處理、異常錯誤碼解決方案—最強的Sping Boot接口優(yōu)雅響應處理器
叉車can總線異常怎么解決
差分探頭測量電壓尖峰異常問題的分析與解決
![差分探頭測量電壓尖峰<b class='flag-5'>異常</b>問題的分析與解決](https://file1.elecfans.com//web2/M00/ED/36/wKgZomZqTMqACZ01AAC5a4J6j0I72.jpeg)
工業(yè)異常檢測超越特定閾值限制的解決方案
![工業(yè)<b class='flag-5'>異常</b>檢測超越特定閾值限制的解決方案](https://file1.elecfans.com/web2/M00/C7/86/wKgZomYUrAuADGibAABRengUCMU384.png)
評論