第9天,異常處理

2021-09-20 01:29:19 字數 4059 閱讀 1306

@(python)[筆記]

一、錯誤和異常

1.1 語法錯誤

1.2 邏輯錯誤

1.3 什麼是異常

1.4 異常的種類

二、異常處理

2.1 什麼是異常處理?

2.2 為何要進行異常處理?

2.3 如何進行異常處理?

2.4 主動觸發異常

2.5 自定義異常

2.6 assert 斷言

python assert斷言的作用

assert斷言語句的語法格式

如何為assert斷言語句新增異常引數

2.7 什麼時候用異常處理

程式中的錯誤分成兩種

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

錯誤示範:

#語法錯誤示範一:if後面沒跟條件和冒號:

if#語法錯誤示範二:定義函式時函式名後面少寫()號;

def test:

pass

#語法錯誤示範三:定義類時,類名後面少寫冒號:

class foo

pass

#語法錯誤示範四: 列印時少寫一半括號

print(haha

錯誤示範一:

#使用者輸入不完整(比如輸入為空)或者輸入非法(輸入不是數字)

num=input(">>: ")

int(num)

錯誤示範二:

#無法完成計算

res1=1/0

res2=1+'str'

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

在python中不同的異常可以用不同的型別去標識,不同的類物件標識不同的異常,乙個異常標識一種錯誤。

常用異常:

attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x

ioerror 輸入/輸出異常;基本上是無法開啟檔案

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

indentationerror 語法錯誤(的子類) ;**沒有正確對齊

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

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

keyboardinterrupt ctrl+c被按下

nameerror 使用乙個還未被賦予物件的變數

syntaxerror python**非法,**不能編譯(個人認為這是語法錯誤,寫錯了)

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

unboundlocalerror 試圖訪問乙個還未被設定的區域性變數,基本上是由於另有乙個同名的全域性變數,

導致你以為正在訪問它

valueerror 傳入乙個呼叫者不期望的值,即使值的型別是正確的

注意:exception是萬能異常,可以匹配到所有異常。

示例一:觸發indexerror異常

l=['egon','aa']

l[3]

示例二:觸發keyerror異常

dic=

dic['age']

示例三:觸發valueerror異常

s='hello'

int(s)

python直譯器檢測到錯誤,觸發異常,也允許程式設計師自己觸發異常;程式設計師編寫特定的**,專門用來捕捉這個異常(這段**與程式邏輯無關,與異常處理有關);如果捕捉成功則進入另外乙個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理。

python直譯器去執行程式,檢測到了乙個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就會在當前異常處終止,後面的**都不會執行了。所以必須提供一種異常處理機制來增強程式的健壯性與容錯性。

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

try:

被檢測的**塊

except 異常型別1:

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

except 異常型別2:

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

finally:

無論是否有異常,都會執行這個位置的邏輯,通常是進行清理工作

使用try..except的方式:

1:把錯誤處理和真正的工作分開來

2:**更易組織,更清晰,複雜的工作任務更容易實現;

3:毫無疑問,更安全了,不至於由於一些小的疏忽而使

主動觸發異常用raise關鍵字定義:

如下示例:

try:

raise typeerror('型別錯誤')

except exception as e:

print(e)

示例如下:

class egonexception(baseexception):

def __init__(self,msg):

self.msg=msg

def __str__(self):

return self.msg

try:

raise egonexception('型別錯誤')

except egonexception as e:

print(e)

參考部落格

使用assert斷言是學習python乙個非常好的習慣,python assert 斷言句語格式及用法很簡單。在沒完善乙個程式之前,我們不知道程式在**會出錯,與其讓它在執行最崩潰,不如在出現錯誤條件時就崩潰,這時候就需要assert斷言的幫助。本文主要是講assert斷言的基礎知識。

python assert斷言的作用

python assert斷言是宣告其布林值必須為真的判定,如果發生異常就說明表達示為假。可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發異常。

assert斷言語句的語法格式

assert python 怎麼用?

expression assert 表示式

下面做一些assert用法的語句供參考:

assert 1==1

assert 2+2==2*2

assert len(['my boy',12])<10

assert range(4)==[0,1,2,3]

如何為assert斷言語句新增異常引數

assert的異常引數,其實就是在斷言表示式後新增字串資訊,用來解釋斷言並更好的知道是**出了問題。格式如下:

assert 表示式 [, 引數]```

```python

assert len(lists) >=5,'列表元素個數小於5'

assert 2==1,'2不等於1'

try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的;

這種東西加的多了,會導致你的**可讀性變差。

而且異常處理本就不是你2b邏輯的擦屁股紙,只有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正。

Java學習第10天(3) 異常機制 多異常處理

對多異常的處理。1,宣告異常時,建議宣告更為具體的異常。這樣處理的可以更具體。2,對方宣告幾個異常,就對應有幾個 catch 塊。不要定義多餘的 catch 塊。如果多個catch 塊中的異常出現繼承關係,父類異常catch 塊放在最下面。建立在進行catch 處理時,catch 中一定要定義具體處...

python第9天數值日期處理

一 處理異常try x 5 0 print x except zerodivisionerror print 不能除以0 except print 其他錯誤 else print 沒有異常 二 測試 import unittest 匯入python自帶的測試模組,單元測試 from yichang ...

Java基礎第9天

字串本身不能改變,但 str 變數中記錄的位址值是可以改變的。構造方法是用來完成 string物件的建立,如下所示,列出常用的構造方法 public string 空構造 public string byte bytes 把位元組陣列轉成字串 public string byte bytes,int...