python異常處理

異常就是程序運(yùn)行的時(shí)候出現(xiàn)了報(bào)錯(cuò)(在程序出現(xiàn)錯(cuò)誤的時(shí)候,則會(huì)產(chǎn)生一個(gè)異常,若程序沒(méi)有處理它,則會(huì)拋出該異常,程序運(yùn)行會(huì)終止)

image.png

出錯(cuò)類型

1.語(yǔ)法錯(cuò)誤(書寫錯(cuò)誤)
如下面的出錯(cuò)


image.png

2.其他類型的出錯(cuò)

# TypeError
for i in 3:
    pass
TypeError: 'int' object is not iterable
類型錯(cuò)誤::int類型不可迭代
----------------------------------------------
# ValueError
inp=input(">>: ") # 輸入 qf
int(inp)
ValueError: invalid literal for int() with base 10: 'qf'
值錯(cuò)誤:int不能把字符串轉(zhuǎn)換成整型
-----------------------------------------------
# NameError
aaa
NameError: name 'aaa' is not defined
名字錯(cuò)誤:名字‘a(chǎn)aa’沒(méi)有定義
----------------------------------------------
# IndexError
l=['yangge','aa']
l[3]
IndexError: list index out of range
索引錯(cuò)誤:數(shù)列的索引超出了范圍
-----------------------------------------------
# KeyError
dic={'name':'yangge'}
dic['age']
KeyError: 'age'
鍵錯(cuò)誤:沒(méi)有這個(gè)鍵
-----------------------------------------------
# AttributeError
class Foo:
    pass
Foo.x
AttributeError: type object 'Foo' has no attribute 'x'
屬性錯(cuò)誤:類型對(duì)象‘Foo’沒(méi)有屬性‘x’
-----------------------------------------------
# ZeroDivisionError:無(wú)法完成計(jì)算
res1=1/0

異常的種類

  • 試圖訪問(wèn)一個(gè)對(duì)象沒(méi)有的屬性,比如foo.x,但是foo沒(méi)有屬性x
    AttributeError

  • 輸入/輸出異常;基本上是無(wú)法打開(kāi)文件
    IOError

  • 無(wú)法導(dǎo)入模塊或包;基本上是路徑問(wèn)題或名稱錯(cuò)誤
    ImportError

  • 語(yǔ)法錯(cuò)誤(的子類) ;代碼沒(méi)有正確對(duì)齊
    IndentationError

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

  • 試圖訪問(wèn)字典里不存在的鍵
    KeyError

  • 按了一下 Ctrl+C
    KeyboardInterrupt(鍵盤中斷)

  • 使用一個(gè)還未被賦予對(duì)象的變量
    NameError

  • 無(wú)效語(yǔ)法,語(yǔ)法錯(cuò)誤
    SyntaxError

  • 傳入對(duì)象類型不符合要求,如sum 函數(shù)需要的是 int,但你傳入了 str
    TypeError

  • 試圖訪問(wèn)一個(gè)還未被設(shè)置的局部變量,基本上是由于另有一個(gè)同名的全局變量,導(dǎo)致你以為正在訪問(wèn)它
    UnboundLocalError
    例如:
    """
    x = 1
    def func():
    x += 1
    return x

func()

UnboundLocalError: local variable 'x' referenced before assignment
局部變量 x 在賦值之前被引用
"""

  • 傳入一個(gè)調(diào)用者不期望的值,即使值的類型是正確的,比如 int('a')
    ValueError

異常處理

為了保證程序的健壯和容錯(cuò)性,即在遇到錯(cuò)誤的程序時(shí)不會(huì)中斷

1.處理方法

使用try:,,,,,except:,,,,,:可以在發(fā)生錯(cuò)誤之后進(jìn)行處理。

try:
   被檢測(cè)到的代碼模塊
except 異常類型:
    try中一旦檢測(cè)到的異常,就執(zhí)行職工位置的邏輯 
-------------------------------
例子:
def func(arg):
    try:
         arg  +=1
    except TypeError as e:    
 #如果檢測(cè)到類型錯(cuò)誤就把這個(gè)類型錯(cuò)誤命名為e;
#并輸出這個(gè)錯(cuò)誤的報(bào)錯(cuò)
         print(e)
func('ad')      #很明顯這是不能用字符串的

2.異常的處理進(jìn)階

2.1處理單種錯(cuò)誤

def func(arg):
    try:
         arg  +=1
    except TypeError as e:    
 #如果檢測(cè)到類型錯(cuò)誤就把這個(gè)類型錯(cuò)誤命名為e;
#并輸出這個(gè)錯(cuò)誤的報(bào)錯(cuò)
         print(e)
func('ad')    

2.2處理多種異常

try:
    .....
except IndexError as a:
     print(a)
except KeyError as a:
     print(a)
except ValueError as a:
     print(a)
#寫多種異常的判斷

2.3處理全部異常
Exception 可以匹配全部的錯(cuò)誤

x="kja"
try:
    int(x)
except Exception as e:
    print(e)

2.4其他的異常處理結(jié)構(gòu)

x = 'akldk'
try:
    int(x)
except Exception as e:
    print(e) 
else:
    print('try內(nèi)代碼塊沒(méi)有異常則執(zhí)行我')
finally:
    print('無(wú)論異常與否,都會(huì)執(zhí)行該模塊,通常是進(jìn)行清理工作'如關(guān)閉文件、關(guān)閉ssh連接、刪除日志等)

異常處理(常用)

import traceback   
#這個(gè)模塊可以用來(lái)捕獲并打印的所有的異常信息(包括哪里犯了這個(gè)錯(cuò)誤)
#注意上面的沒(méi)有使用這個(gè)模塊的只會(huì)打印出是犯了哪種錯(cuò)誤
#而不不知道在哪個(gè)文件哪個(gè)函數(shù)哪一行出錯(cuò)了
print('start-->')
try:
    1 + 'a'
except TypeError as e:
    print(e)
    print('*' * 30)
    print(traceback.format_exc())    #這個(gè)可以用來(lái)接受全部的報(bào)錯(cuò)
    print('*' * 20)

print('end')

traceback.print_exc()跟traceback.format_exc()有什么區(qū)別呢?
format_exc()返回字符串,print_exc()則直接給打印出來(lái)。
即traceback.print_exc()與print traceback.format_exc()效果是一樣的。
print_exc()還可以接受file參數(shù)直接寫入到一個(gè)文件。比如
traceback.print_exc(file=open('tb.txt','w+'))
寫入到tb.txt文件去。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容