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文章
4799瀏覽量
84810 -
異常
+關注
關注
0文章
22瀏覽量
9263
發(fā)布評論請先 登錄
相關推薦
評論