真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python學(xué)習(xí)—異常

一.異常處理的定義

python解釋器檢測到錯誤,觸發(fā)異常(也允許程序員自己觸發(fā)異常)

目前創(chuàng)新互聯(lián)已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、澄城網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

程序員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程序邏輯無關(guān),與異常處理有關(guān))

如果捕捉成功則進入另外一個處理分支,執(zhí)行你為其定制的邏輯,使程序不會崩潰,這就是異常處理

二.異常處理的用法

為了保證程序的健壯性與容錯性,即在遇到錯誤時候程序不會崩潰,我們需要對異常進行處理,
1,如果錯誤發(fā)生的條件是可預(yù)知的,我們需要用if進行處理,在錯誤發(fā)生之前進行預(yù)防

age1 = 10
while True:
    age=input('輸入: ')
        if age.isdigit(): #只有在age為字符串形式的整數(shù)時,下列代碼才不會出錯,該條件是可預(yù)知的
        age=int(age)
        if age == age1:
            print('you got it')
            break


2,如果錯誤發(fā)生的條件是不可預(yù)知的,則需要用到try..except:在錯誤發(fā)生之后進行處理

三.基本語法為

try:
    被檢測的代碼塊
except 異常類型:
    try中一旦檢測到異常,就執(zhí)行這個位置的邏輯

舉例

try:
    f=open('a.txt')
    g=(line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

四.try...except...的詳細用法

我們把可能發(fā)生錯誤的語句放在try模塊里,用except來處理異常。except可以處理一個專門的異常,也可以處理一組圓括號中的異常,如果except后沒有指定異常,則默認處理所有的異常。每一個try,都必須至少有一個except
1.異常類只能來處理指定的異常情況,如果非指定異常則無法處理

s1 = 'hello'
try:
    int(s1)
except IndexError as e: # 捕獲到異常,程序直接報錯
    print(e)


2.多分支

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)


3.萬能異常Exception

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)


4.多分支+Exception

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)


5.異常的其他機構(gòu)(try...finally語法)

try...finally語句無論是否發(fā)生異常都將會執(zhí)行最后的代碼。語法如下:

try:
<語句>
finally:
<語句>    #退出try時總會執(zhí)行
raise

示例:

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
else:
    print('try內(nèi)代碼塊沒有異常則執(zhí)行我')
finally:
    print('無論異常與否,都會執(zhí)行該模塊,通常是進行清理工作')


6.主動觸發(fā)異常(raise語句)

我們可以使用raise語句自己觸發(fā)異常,raise語法格式如下:

raise [Exception [, args [, traceback]]]

語句中Exception是異常的類型(例如,NameError)參數(shù)是一個異常參數(shù)值。該參數(shù)是可選的,如果不提供,異常的參數(shù)是"None"。

最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。

示例:

一個異??梢允且粋€字符串,類或?qū)ο蟆?Python的內(nèi)核提供的異常,大多數(shù)都是實例化的類,這是一個類的實例的參數(shù)。

定義一個異常非常簡單,如下所示:

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 觸發(fā)異常后,后面的代碼就不會再執(zhí)行

try:
    raise TypeError('類型錯誤')
except Exception as e:
    print(e)


7.自定義異常

通過創(chuàng)建一個新的異常類,程序可以命名它們自己的異常。異常應(yīng)該是典型的繼承自Exception類,通過直接或間接的方式。

以下為與BaseException相關(guān)的實例,實例中創(chuàng)建了一個類,基類為BaseException,用于在異常觸發(fā)時輸出更多的信息。

在try語句塊中,用戶自定義的異常后執(zhí)行except塊語句,變量 e 是用于創(chuàng)建Networkerror類的實例。

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

try:
    raise Networkerror('類型錯誤')
except Networkerror as e:
    print(e)

8.斷言:assert條件

assert 1 == 1  #不會報錯
assert 1 == 2  #會報錯
assert 1 != 1  #會報錯

栗子:

def is_huiwen_num(num):
    snum = str(num)
    return snum == snum[::-1]

# 如果希望程序中的所有assert語句不執(zhí)行, 那么給python -O 腳本名
if __name__ == "__main__":
    assert is_huiwen_num(100) == True    #會在這里直接拋出異常,中斷執(zhí)行過程
    assert  is_huiwen_num(101) == True
    print("assert")

運行結(jié)果:
Traceback (most recent call last):
  File "/home/kiosk/PycharmProjects/python_projects/ttttt.py", line 7, in 
    assert is_huiwen_num(100) == True
AssertionError

五.常見異常種類

在python中不同的異??梢杂貌煌念愋停╬ython中統(tǒng)一了類與類別,類型即類)取標(biāo)識,一個異常標(biāo)識一種錯誤。
常見語法錯誤

AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x

IOError 輸入/輸出異常;基本上是無法打開文件

ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤

IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊

IndexError 下標(biāo)索引超出序列邊界,比如當(dāng)x只有三個元素,卻試圖訪問x[5]

KeyError 試圖訪問字典里不存在的鍵

KeyboardInterrupt Ctrl+C被按下

NameError 使用一個還未被賦予對象的變量

SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)

TypeError 傳入對象類型與要求的不符合

UnboundLocalError 試圖訪問一個還未被設(shè)置的局部變量,基本上是由于另有一個同名的全局變量,導(dǎo)致你以為正在訪問它

ValueError 傳入一個調(diào)用者不期望的值,即使值的類型是正確的

網(wǎng)頁題目:Python學(xué)習(xí)—異常
本文地址:http://weahome.cn/article/jjieod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部