Python 異常處理

2022-07-26 01:54:08 字數 4619 閱讀 2796

異常處理

一、錯誤和異常

程式中難免出現錯誤,而錯誤分為兩種:語言異常和邏輯異常

1.語法錯誤(這種錯誤,根本過不了python直譯器的語法檢測,必須在程式執行前就改正)

for i in range(5)

print(i)

2.邏輯錯誤

#型別錯誤

num = input(">>>")

int(num)

res = 1/0

res1 = 1+ 'str'

異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下:

python中有很多不同的異常種類,python中不同的異常可以用不同的型別(python中統一了類與型別,型別即類)去標識,不同的類物件標識不同的異常,乙個異常標識一種錯誤

例如:

indexerror 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]

keyerror 試圖訪問字典裡不存在的鍵

typeerror 傳入物件型別與要求的不符合

二、異常處理

1、什麼叫異常處理

python直譯器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)

程式設計師編寫特定的**,專門用來捕捉這個異常(這段**與程式邏輯無關,與異常處理有關)。如果捕捉成功則進入另外乙個處理分支,執行你為其定製的處理邏輯,使程式不會崩潰,這就是異常處理。

因為python解析器去執行程式,檢測到了乙個錯誤時,會觸發異常,異常觸發之後且在沒被處理的情況下,程式就在當前異常處終止,後面的**不會執行。就會導致執行的軟體崩潰。而異常處理機制就是間接的增強程式的容錯性,讓程式遇到錯誤時不會停止,軟體正常執行,而不是崩潰。

2、怎麼處理異常

首先須知,異常是由程式的錯誤引起的,語法上的錯誤跟異常處理無關,必須在程式執行前就修正

處理異常有兩種方式:1、用if判斷;2、try: **段 except 異常: 處理方式

1、用if判斷

l = [1,2,3,4,5]

if len(l) >1000: #條件不滿足,跳過

print(l.index(1000))

else:

print(l[4])

總結:1.if判斷式的異常處理只能針對某一段**,對於不同的**段的相同型別的錯誤你需要寫重複的if來進行處理。

2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,就像是在你的**中到處插**,直接導致可讀性極其的差。

3.if是可以解決異常的,只是存在1,2的問題。所以,千萬不要妄下定論if不能用來異常處理。

2、try: **段 except 異常: 處理方式    exception 萬能異常,捕捉所有異常

python為每一種異常定製了乙個型別,然後提供了一種特定的語法結構用來進行異常處理

1)基本語法:

try:

被檢測的**塊

except 異常型別:

try中一旦檢測到異常,就執行這個位置的邏輯

2)異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

try:

print("11111")

print("22222")

print(x)

print("33333")

print("*****")

except nameerror as x:

print(x)

print("繼續執行其他操作!")

#執行結果:

11111

22222

name 'x' is not defined

繼續執行其他操作!

3)不同型別的異常類可以同時存在,構成多分支結構!

try:

print("11111")

print("22222")

print(x)

print("33333")

print("*****")

except valueerror as x:

print(x)

except keyerror as y:

print(y)

except nameerror as z:

print(z)

print("繼續執行其他操作!")

4)萬能異常 在python的異常中,有乙個萬能異常:exception,他可以捕獲任何異常。

try:

print("11111")

print("22222")

print(x)

print("33333")

print("*****")

except valueerror as x:

print(x)

except keyerror as y:

print(y)

except exception as z: #捕獲其他任何異常

print(z)

print("繼續執行其他操作!")

5)異常的其他機構

try:

print("=---->")

print(x)

print("-=--->")

except nameerror as x:

print(x)

except exception as y:

print(y)

else:

print("try內**塊沒有異常則執行!")

finally:

print("無論異常與否,都會執行該模組,通常是進行清理工作")

print("繼續執行其他操作!")

#執行結果:

=---->

name 'x' is not defined

無論異常與否,都會執行該模組,通常是進行清理工作

繼續執行其他操作!

6)主動觸發異常

7)自定義異常(由於異常是類,自定義異常類的時候,需要繼承基類-萬能異常)

#_*_coding:utf-8_*_

class alexexception(baseexception):

def __init__(self,msg):

self.msg=msg

def __str__(self):

return self.msg

try:

raise alexexception('型別錯誤')

except alexexception as e:

print(e)

8)斷言  assert 條件

x = 1

y = 1

assert x == y #x = y 判斷對就執行,不對就拋異常

print('=-====>')

y = 2

assert x == y #判斷 對就執行,不對就拋異常

print('=-====>')

總結:什麼是異常,異常就是錯誤引發的結果

什麼是處理,由於異常帶來的是程式崩潰,處理的目的就是讓程式在異常後跳轉到其他邏輯去執行,不讓程式崩潰

if 和 try...excpet都可以進行異常處理判斷,只不過if是針對一種異常的多分支,針對不同段**的同種型別錯誤,你需要重複寫多分支if,而try是針對不同型別異常的多分支,可以把不同段**放到一起,檢測他們的同種型別錯誤。

過多的使用某個處理異常的方式,就會直接導致程式可讀性及其的差。所以要分清情況再選擇處理異常的方式。try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的。只有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正

歸納總結:

異常處理

分成兩種:一種是由語法上的錯誤引發的異常;

另外一種是邏輯上的錯誤引發的異常。

對於語法上的異常:應該是在程式執行前就改正;

對於邏輯上的錯誤,盡量使用if來預防異常;

對於邏輯上無法預知的錯誤,應該用try...except...去處理

語法:try:

被監測的**塊

except 異常型別 as e:

print(e)

except exception as e: #萬能異常

pass

else:

沒有異常時觸發

finally:

有沒有異常都觸發

#自定義異常:

class myexception(baseexception):

pass

#主動拋異常:

raise type('異常值')

#斷言 程式執行到這一步,進行判斷,然後在再執行。

assert 1 == 1 assert 1==2

注意點:不要把異常處理作為程式設計邏輯錯誤的尚方寶劍,能少用盡量少用。

python異常處理 Python 異常處理

使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...

python異常舉例 Python異常處理

1.1異常問題舉例 例一 i input 請輸入數字 請輸入數字 0 print i print 5 int i traceback most recent call last file line 1,in zerodivisionerror division by zero 上述 的報錯是除零的錯...

python異常處理

當你的程式中出現異常情況時就需要異常處理。比如當你開啟乙個不存在的檔案時。當你的程式中有一些無效的語句時,python會提示你有錯誤存在。下面是乙個拼寫錯誤的例子,print寫成了print。python是大小寫敏感的,因此python將引發乙個錯誤 print hello world file l...