成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Python中異常怎么處理-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Python中異常怎么處理,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、漠河網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為漠河等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

一、什么是異常處理

定義:異常處理就是我們?cè)趯慞ython時(shí),經(jīng)??吹降膱?bào)錯(cuò)信息,例如;NameError TypeError ValueError等,這些都是異常。

異常是一個(gè)事件,改事件會(huì)在程序執(zhí)行過程中發(fā)生,影響程序的正常執(zhí)行,一般情況下,在python中無(wú)法處理程序時(shí)就會(huì)發(fā)生異常,異常時(shí)Python的一個(gè)對(duì)象,表示一個(gè)錯(cuò)誤,當(dāng)Python腳本發(fā)生異常時(shí),我們需要捕獲并處理異常,否則程序就會(huì)終止執(zhí)行。

二、異常處理

當(dāng)Python腳本出現(xiàn)異常的時(shí)候我們?cè)趺刺幚砟牵?/p>

就如我們使用的工具出現(xiàn)了一點(diǎn)毛病,我們可以想辦法修理好它,程序也是一樣,之前的前輩們經(jīng)過不斷的積累與思考,創(chuàng)造了很多好得方法處理程序中出現(xiàn)的異常,本章我們就講一下使用try語(yǔ)句處理異常。

首先我們來(lái)說(shuō)一下try語(yǔ)句的語(yǔ)法:

try語(yǔ)句與except 相結(jié)合使用,此語(yǔ)句用來(lái)檢測(cè)try語(yǔ)句塊中的錯(cuò)誤,從而讓except語(yǔ)句捕獲異常信息并處理,如果不想在發(fā)生異常時(shí)結(jié)束程序,只需要在try語(yǔ)句中捕獲異常即可

try:
<代碼塊> 
except <異常名字>
print(‘語(yǔ)句')
實(shí)例如下:
def func():
try:
a = x/y
print('a=',a)
return a
eccept Exception:
print('程序出現(xiàn)異常,異常信息:被除數(shù)為0')

三、拋出異常

在Python中使用raise語(yǔ)句拋出一個(gè)指定的異常,我們可以使用類或?qū)嵗齾?shù)調(diào)用raise語(yǔ)句引發(fā)異常。
實(shí)例如下:

class EvaException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg

try:
raise EvaException('類型錯(cuò)誤')
except EvaException as e:
print(e)

四、捕捉多個(gè)異常

我們前面說(shuō)了怎么處理一個(gè)異常的情況,如果涉及到多個(gè),我們?cè)撛趺刺幚砟牵?/p>

在Python中支持一個(gè)try/except語(yǔ)句處理多個(gè)異常,語(yǔ)法如下:

try:
<語(yǔ)句>
except <異常名字>:
print(‘異常說(shuō)明')
except <異常名字>:
print(‘異常說(shuō)明')
try語(yǔ)句的工作方式如下:
  首次執(zhí)行try中語(yǔ)句塊,如果沒有發(fā)生異常,則忽略except中的字句,try語(yǔ)句中的代碼塊執(zhí)行后結(jié)束。如果try語(yǔ)句中的代碼塊出現(xiàn)異常,try中的剩余語(yǔ)句則會(huì)被忽略,
如果異常和eccept中的異常名字一直,相應(yīng)的except語(yǔ)句就會(huì)被執(zhí)行。如果一個(gè)異常也沒有匹配,這個(gè)異常就會(huì)傳遞給上層的try語(yǔ)句中,一個(gè)語(yǔ)句可能包含第一個(gè)except語(yǔ)句,
分別處理不同的異常,但是最多只有一個(gè)分支會(huì)執(zhí)行。
try:
#a
#1/0
dic = {1:2}
dic[3]
except NameError:
print('名字沒有定義,報(bào)錯(cuò)了')
except ZeroDivisionError:
print('0不能當(dāng)做除數(shù),報(bào)錯(cuò)了')
except KeyError:
print('沒有這個(gè)key')

五、異常中else

我們?nèi)绻绦驁?zhí)行完異常后還想做其他的事情怎么辦?

這時(shí)我們就可以用到異常中的else了,具體語(yǔ)法如下:

try:
<語(yǔ)句>
except <異常名字> :
<語(yǔ)句>
except <異常名字>:
<語(yǔ)句>
else:
<語(yǔ)句> #(try語(yǔ)句中沒有異常后執(zhí)行此段代碼)
如果在try語(yǔ)句中執(zhí)行沒有發(fā)生異常,就會(huì)執(zhí)行else語(yǔ)句,使用else語(yǔ)句比把所有語(yǔ)句都放在try字句里面更好,這樣可以避免一些意想不到的而except有沒有捕獲到的異常:
def func(x,y):
try:
a = x/y
except :
print('Error,happened')
else:
print('It went as execpt')
func(2,1)

六、用戶自定義異常

你可以通過創(chuàng)建一個(gè)新的exception類來(lái)?yè)碛凶约旱漠惓?。異常?yīng)該繼承自 Exception 類,或者直接繼承,或者間接繼承,例如:

class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)

try:
raise MyError(2*2)
except MyError as e:
print('My exception occurred, value:', e.value)

My exception occurred, value: 4
raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
main__.MyError: '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)的異常命名一樣。

七、定義清理行為(finally語(yǔ)句)

try 語(yǔ)句還有另外一個(gè)可選的子句,它定義了無(wú)論在任何情況下都會(huì)執(zhí)行的清理行為。 例如:

>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
... 
Goodbye, world!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
以上例子不管 try 子句里面有沒有發(fā)生異常,finally 子句都會(huì)執(zhí)行。

如果一個(gè)異常在 try 子句里(或者在 except 和 else 子句里)被拋出,而又沒有任何的 except 把它截住,那么這個(gè)異常會(huì)在 finally 子句執(zhí)行后再次被拋出。

下面是一個(gè)更加復(fù)雜的例子(在同一個(gè) try 語(yǔ)句里包含 except 和 finally 子句):

>>> def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")

>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
預(yù)定義的清理行為
一些對(duì)象定義了標(biāo)準(zhǔn)的清理行為,無(wú)論系統(tǒng)是否成功的使用了它,一旦不需要它了,那么這個(gè)標(biāo)準(zhǔn)的清理行為就會(huì)執(zhí)行。

這面這個(gè)例子展示了嘗試打開一個(gè)文件,然后把內(nèi)容打印到屏幕上:

for line in open("myfile.txt"):
print(line, end="")
以上這段代碼的問題是,當(dāng)執(zhí)行完畢后,文件會(huì)保持打開狀態(tài),并沒有被關(guān)閉。

關(guān)鍵詞 with 語(yǔ)句就可以保證諸如文件之類的對(duì)象在使用完之后一定會(huì)正確的執(zhí)行他的清理方法:

with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上這段代碼執(zhí)行完畢后,就算在處理過程中出問題了,文件 f 總是會(huì)關(guān)閉。

python標(biāo)準(zhǔn)異常

異常名稱描述
BaseException所有異常的基類
SystemExit解釋器請(qǐng)求退出
KeyboardInterrupt用戶中斷執(zhí)行(通常是輸入^C)
Exception常規(guī)錯(cuò)誤的基類

          StopIteration

迭代器沒有更多的值
GeneratorExit生成器(generator)發(fā)生異常來(lái)通知退出
StandardError所有的內(nèi)建標(biāo)準(zhǔn)異常的基類
ArithmeticError所有數(shù)值計(jì)算錯(cuò)誤的基類
FloatingPointError浮點(diǎn)計(jì)算錯(cuò)誤
OverflowError數(shù)值運(yùn)算超出大限制
ZeroDivisionError除(或取模)零 (所有數(shù)據(jù)類型)
AssertionError斷言語(yǔ)句失敗
AttributeError對(duì)象沒有這個(gè)屬性
EOFError沒有內(nèi)建輸入,到達(dá)EOF 標(biāo)記
EnvironmentError操作系統(tǒng)錯(cuò)誤的基類
IOError輸入/輸出操作失敗
OSError操作系統(tǒng)錯(cuò)誤
WindowsError系統(tǒng)調(diào)用失敗
ImportError導(dǎo)入模塊/對(duì)象失敗
LookupError無(wú)效數(shù)據(jù)查詢的基類
IndexError序列中沒有此索引(index)
KeyError映射中沒有這個(gè)鍵
MemoryError內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)
NameError未聲明/初始化對(duì)象 (沒有屬性)
UnboundLocalError訪問未初始化的本地變量
ReferenceError弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對(duì)象
RuntimeError一般的運(yùn)行時(shí)錯(cuò)誤
NotImplementedError尚未實(shí)現(xiàn)的方法
SyntaxErrorPython 語(yǔ)法錯(cuò)誤
IndentationError縮進(jìn)錯(cuò)誤
TabErrorTab 和空格混用
SystemError一般的解釋器系統(tǒng)錯(cuò)誤
TypeError對(duì)類型無(wú)效的操作
ValueError傳入無(wú)效的參數(shù)
UnicodeErrorUnicode 相關(guān)的錯(cuò)誤
UnicodeDecodeErrorUnicode 解碼時(shí)的錯(cuò)誤
UnicodeEncodeErrorUnicode 編碼時(shí)錯(cuò)誤
UnicodeTranslateErrorUnicode 轉(zhuǎn)換時(shí)錯(cuò)誤
Warning警告的基類
DeprecationWarning關(guān)于被棄用的特征的警告
FutureWarning關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告
OverflowWarning舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告
PendingDeprecationWarning關(guān)于特性將會(huì)被廢棄的警告
RuntimeWarning可疑的運(yùn)行時(shí)行為(runtime behavior)的警告
SyntaxWarning可疑的語(yǔ)法的警告
UserWarning用戶代碼生成的警告

關(guān)于“Python中異常怎么處理”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

當(dāng)前題目:Python中異常怎么處理-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://jinyejixie.com/article26/ccsojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
元阳县| 岳西县| 鹤庆县| 德化县| 崇州市| 阳信县| 淄博市| 图们市| 奉新县| 东至县| 房山区| 曲水县| 海伦市| 宁明县| 隆化县| 永城市| 天峻县| 浦江县| 南岸区| 巴青县| 长治县| 枞阳县| 万源市| 舟曲县| 文安县| 南康市| 衡东县| 获嘉县| 永康市| 太湖县| 云霄县| 娄烦县| 化隆| 水城县| 瑞丽市| 湖北省| 柘城县| 大同市| 天全县| 五大连池市| 金川县|