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