Python錯誤和異常


目錄

 

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的方式

  1. 把錯誤處理和真正的工作分開來
  2. 代碼更易組織,更清晰,復雜的工作任務更容易實現;
  3. 毫無疑問,更安全了,不至於由於一些小的疏忽而使程序意外崩潰了;

什么時候用異常處理

try…except應該盡量少用,因為它本身就是你附加給你的程序的一種異常處理的邏輯,與你的主要的工作是沒有關系的
這種東西加的多了,會導致你的代碼可讀性變差

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM