Python中的異常處理學(xué)習(xí)筆記
Python 是面向?qū)ο蟮恼Z言,所以程序拋出的異常也是類。
常見的異常類
1.NameError:嘗試訪問一個沒有申明的變量
2.ZeroDivisionError:除數(shù)為 0
3.SyntaxError:語法錯誤
4.IndexError:索引超出序列范圍
5.KeyError:請求一個不存在的字典關(guān)鍵字
6.IOError:輸入輸出錯誤(比如你要讀的文件不存在)
7.AttributeError:嘗試訪問未知的對象屬性
8.TypeError:傳給函數(shù)的參數(shù)類型不正確,比如給 int 函數(shù)傳入字符型
自定義異常類
盡管內(nèi)建的異常類已經(jīng)包括大部分情況,但如果需要創(chuàng)建自己的異常類,可以采用下面的方法:
class CustomException(Exception): # Exception 為所有異常的基類
# 處理異常的代碼
捕獲異常
try:
# 需要進(jìn)行捕獲異常的代碼,只有出現(xiàn)異常之前的代碼被最終執(zhí)行
except (Exception1,Exception2,...) as argument:
# 捕獲到 (Exception1,Exception2,...) 里的異常才執(zhí)行本段代碼
# argument 是一個異常類的實例,包含異常的具體信息
except:
# 捕獲到 (Exception1,Exception2,...) 以外的異常執(zhí)行本段代碼,用 sys 模塊的 exc_info() 函數(shù)可以獲取異常信息
else:
# 如果沒有捕獲到異常則執(zhí)行本段代碼
finally:
# 無論是否捕獲到異常都執(zhí)行本段代碼
上述語句并不都是必須的,譬如 try...except...、try...finally... 或者 try...except...else... 語句都是可行的。我們還可以 用 try...except...else... 代替 if...else...。
拋出異常
如果我們想要在自己編寫的程序中主動拋出異常,可以采用如下兩種方法:
raise Exception(reason)
Exception 必須是一個異常類的名稱??蛇x項 reason 用來傳遞異常的信息。
assert expression[,reason]
assert 是斷言的關(guān)鍵字。當(dāng)表達(dá)式 expression 為真則什么都不做,否則拋出 AssertionError 異常。reason 提供異常的信息。
上下文管理器
由于對象 File 支持上下文管理協(xié)議,因此可以采用下面的方法打開文件:
with open('filename') as fp:
# 無論本段代碼是否出現(xiàn)異常,文件對象 fp 均能正確關(guān)閉
Example
import sys
def div(num, den):
print('_________________ (',num,',',den,')\n')
try:
ans = num/den
assert den != num, 'Equal' # 斷言:分子分母不相等
den = 'Changed' # 如果執(zhí)行本語句之前未出現(xiàn)異常,改變 den 的值
if num % 2: # 如果分子為奇數(shù),則拋出異常
raise ValueError('Odd')
except ZeroDivisionError as e:
print('except ... as ...\n\t', e)
except:
print('except\n\t', sys.exc_info())
else:
print('else\n\t', ans)
finally:
print('finally\n\t', den)
div(1,0) # 除數(shù)為零,為 ZeroDivisionError 異常類
div(1,1) # 分子等于分母,斷言為假,拋出異常
div(2,1) # 無異常
div(3,1) # 分子為奇數(shù),通過 raise 拋出異常
div(3,'x') # 不屬于 ZeroDivisionError 的其他異常
運行結(jié)果:
_________________ ( 1 , 0 )
except ... as ...
division by zero
finally
0
_________________ ( 1 , 1 )
except
(<class 'AssertionError'>, AssertionError('Equal',), <traceback object at 0x00000000029B42C8>)
finally
1
_________________ ( 2 , 1 )
else
2.0
finally
Changed
_________________ ( 3 , 1 )
except
(<class 'ValueError'>, ValueError('Odd',), <traceback object at 0x00000000029B42C8>)
finally
Changed
_________________ ( 3 , x )
except
(<class 'TypeError'>, TypeError("unsupported operand type(s) for /: 'int' and 'str'",), <traceback object at 0x00000000029B42C8>)
finally
x
相關(guān)文章
Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻
近日,有朋友向我求助一件小事兒,他在一個短視頻app上看到一個好玩兒的段子,想下載下來,可死活找不到下載的方法。經(jīng)過我的一番研究才找到解決方法,下面小編給大家分享Python 利用scrapy爬蟲通過短短50行代碼下載整站短視頻的方法,感興趣的朋友一起看看吧2018-10-10用python爬取中國大學(xué)排名網(wǎng)站排名信息
大家好,本篇文章主要講的是用python爬取中國大學(xué)排名網(wǎng)站排名信息,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01Python爬蟲獲取數(shù)據(jù)保存到數(shù)據(jù)庫中的超詳細(xì)教程(一看就會)
使用爬蟲爬數(shù)據(jù),總要涉及到數(shù)據(jù)持久化,也就是數(shù)據(jù)存儲的問題,下面這篇文章主要給大家介紹了關(guān)于Python爬蟲獲取數(shù)據(jù)保存到數(shù)據(jù)庫中的超詳細(xì)教程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06一篇文章教你掌握python數(shù)據(jù)類型的底層實現(xiàn)
這篇文章主要介紹了Python 數(shù)據(jù)類型的底層實現(xiàn)原理分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-09-09Python實現(xiàn)動態(tài)二維碼生成的示例代碼
這篇文章主要和大家分享兩個制作二維碼的Python庫,可以生成普通的二維碼、圖片背景版二維碼、動圖GIF版二維。文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-05-05Python利用appium實現(xiàn)模擬手機滑動操控的操作
Appium 是一個開源、跨平臺的自動化測試工具,用于測試原生和輕量移動應(yīng)用,支持 iOS, Android 和 FirefoxOS 平臺。本文將利用appium實現(xiàn)模擬手機滑動操控的操作,感興趣的可以了解一下2022-07-07