目錄
1 錯誤和異常
1.1 錯誤
python 中的錯誤有兩種,語法錯誤和邏輯錯誤
這種錯誤是我們應該避免的
1.2 異常
python中的異常是程序運行過程中產生的,有異常不一定要把程序停止,只要把異常拋出,然后查看異常產生的原因即可。
1.2.1 python中的異常種類
AttributeError 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError使用一個還未被賦予對象的變量
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量,
導致你以為正在訪問它
ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
## 2 異常處理
>
Python解釋器檢測到錯誤,觸發異常,程序員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程序邏輯無關,與異常處理有關)如果捕捉成功則進入另外一個處理分支,執行你為其定制的邏輯,使程序不會崩潰,這就是異常處理
### 2.1 python 的異常處理機制
```python
try:
被檢測的代碼塊
except 異常類型:
try中一旦檢測到異常,就執行這個位置的邏輯
下面的except就是相當於if,但是不能把所有的的錯誤用except,於是就有了Exception
try:
print("====")
print(x)
except KeyError as x: # 命名錯誤
print(x) # 把錯誤的內容傳遞給x
except NameError as y:
print(y)
Exception 萬能異常
x = 1
try:
print(x)
except Exception as e: # 都能處理異常
print(e)
else:
# pass
print("hello") # try內代碼塊沒有異常則執行我
finally:
# pass
print("都會執行") # 通常用於清理工作,比如關閉數據連接
主動拋出異常
try:
raise TypeError('類型錯誤')
except Exception as e:
print(e)
自定義異常
class abcException(BaseException): # 這里是繼承BaseException
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise abcException('類型錯誤')
except abcException as e:
print(e)
斷言
assert 1 == 1
assert 1 == 2
try..except的方式比較if的方式的好處
try..except這種異常處理機制就是取代if那種方式,讓你的程序在不犧牲可讀性的前提下增強健壯性和容錯性
異常處理中為每一個異常定制了異常類型(python中統一了類與類型,類型即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段代碼的異常(無需‘寫多個if判斷式’)減少了代碼,增強了可讀性
使用try..except的方式
- 把錯誤處理和真正的工作分開來
- 代碼更易組織,更清晰,復雜的工作任務更容易實現;
- 毫無疑問,更安全了,不至於由於一些小的疏忽而使程序意外崩潰了;
什么時候用異常處理
try…except應該盡量少用,因為它本身就是你附加給你的程序的一種異常處理的邏輯,與你的主要的工作是沒有關系的
這種東西加的多了,會導致你的代碼可讀性變差