一文看懂Python異常處理(exception, try和raise語句)

2021-02-19 Python Web與Django開發

一個Python程序在運行時,如果解釋器遇到到一個錯誤,會停止程序的執行,並且提示一些錯誤信息,這就是異常(Exception)。即便Python程序的語法是正確的,還是會有各種各樣意想不到的異常或錯誤。大多數的異常都不會被程序處理,而是以錯誤信息的形式展現出來,如下所示:

>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly

異常以不同的類型出現,這些類型都作為信息的一部分列印出來: 例子中的類型有 ZeroDivisionError,NameError 和 TypeError。

Python的內建異常

Python的一些常見內建異常如下所示,這些都是你必須熟知和掌握的。

Exception 常規錯誤的基類
AttributeError 對象沒有這個屬性
IOError 輸入/輸出操作失敗
IndexError 序列中沒有此索引(index)
KeyError 映射中沒有這個鍵
NameError 未聲明/初始化對象 (沒有屬性)
SyntaxError Python 語法錯誤
TypeError 對類型無效的操作
ValueError 傳入無效的參數
ZeroDivisionError 除(或取模)零 (所有數據類型)

完整內置異常見下圖:


異常處理

沒有異常處理的特點是出現異常會終止程序執行。比如下例中當你輸入的x不是整數時,程序會立刻中止並拋出異常,ok和end不會被列印。

print("start")
x = int(input("Please enter a number: "))
print("number:",x)
print("ok....")
print("end")

使用了有異常處理的代碼,程序會執行到最後。

print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print("ok....")
except ValueError:
print("Oops! That was no valid number. Try again")
print("end")

try語句按照如下方式工作;

首先,執行try子句(在關鍵字try和關鍵字except之間的語句)

如果沒有異常發生,忽略except子句,try子句執行後結束。

如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的類型和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的代碼。

如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。

一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執行。最後一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法列印一個錯誤信息,然後再次把異常拋出。

import sys

try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise

一個except子句可以同時處理多個異常,這些異常將被放在一個括號裡成為一個元組,例如:

except (RuntimeError, TypeError, NameError):
pass

異常處理實例

我們用一個實例體會下關於try語句的要點。

print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print(100/x)
print("ok....")
except ValueError:
print("非純數字錯誤!")
except ZeroDivisionError:
print("不可以為零錯誤!")
except:
print("可選的未知錯誤!")
print("end")

print("start")
try:
x = int(input("Please enter a number: "))
print("number:",x)
print(100/x)
print("ok....")
except (ValueError,ZeroDivisionError):
print("非純數字或不可以為零錯誤!")
except:
print("可選的未知錯誤!")
raise #重新拋出這個異常
print("end")

拋出異常(自行拋出異常)

Python 使用 raise 語句拋出一個指定的異常。例如:

>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere

>>> try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise

An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere

參考原文:

https://edu.csdn.net/notebook/python/week02/2.html

相關閱讀

一文看懂Python多進程與多線程編程(工作學習面試必讀)

一文看懂Python系列之裝飾器(decorator)(工作面試必讀)

一文看懂Python面向對象編程(Python學習與新手入門必看)-絕對原創



相關焦點

  • 第16天:Python 錯誤和異常
    在 Python 中,異常是一個對象,用於表示一個錯誤,當 Python腳本發生異常時我們需要捕獲和處理它,否則程序會終止執行。處理異常Python 提供了 try/except語句用來捕獲和處理異常。try 語句用來檢測語句塊中是否有錯誤,except 語句則用來捕獲 try 語句中的異常,並進行處理,附加的 else 可以在 try 語句沒有異常時執行。
  • python異常處理與上下文管理器
    異常處理異常與錯誤錯誤可以通過IDE或者解釋器給出提示的錯誤opentxt('a.jpg','r')語法層面沒有問題,但是自己代碼的邏輯有問題if age>18: print('未成年')異常多指在程序執行過程中,出現的未知錯誤,語法和邏輯本身是正確的。
  • 未雨綢繆-Python異常
    2 異常分類與處理2.1 raise語句要引發異常,可使用raise語句,並將一個類(必須是Exception的子類)或實例作為參數。將類作為參數時,將自動創建一個實例。因此,自定義異常類的代碼類似於下面這樣:class SomeCustomException(Exception): pass2.3 捕獲異常對程序中的異常進行處理,通常稱之為捕獲異常。為此,可使用try/except語句。
  • Day15.異常的處理
    python中有兩種錯誤很容易辨認:語法錯誤和異常。語法錯誤python的語法錯誤又稱為解析錯,多數是語法格式上出現問題。請輸入一個數字:3'''try 語句按照如下方式工作;首先,執行 try 子句(在關鍵字 try 和關鍵字 except 之間的語句)。
  • python入門——Python中異常處理
    python大數據課堂已經開始了。想轉行大數據,數據挖掘,機器學習,人工智慧的小夥伴可以關注啦。上一篇帶大家了解了python中的I/O函數。今天我們來繼續了解python中的異常處理。調試環境以python3.6環境為例。需要代碼和demo的朋友可以搜索「欒鵬全棧」到我的CSDN博客。
  • python中異常報錯的總結分析與處理方式
    想必到現在經過python基礎的學習之後,小夥伴們都已經開始寫很多腳本了,有大的有小的,但是有的時候並不是所寫的能夠順利跑出結果來,期間會有不但的報錯以及異常,很多我們都不理解,所以也就不會修改,這是寫腳本中常遇到的問題,雖然在當時被定型為絆腳石,但是多次遇到異常後我們會發現這是一筆不可多得的財富。對個人的成長有很大的幫助。
  • 想通過python面試環節,必須懂得異常原理
    我們先通過一個例子來了解代碼中引入異常處理的原因。 我們可以利用條件語句來解決這個問題,代碼如下:print('Start')a=10b=0if b!=0: print(a/b)print('End')我們也可以通過python的異常處理機制來解決這個問題。在python中捕捉異常可以使用try/except語句。
  • 深入 Python 異常處理
    【導語】:本文結合例程總結Python異常處理的相關知識,幫你深入理解python異常處理。在Python 中的錯誤和異常是什麼?通常來說,程序中的錯誤至少包括兩種,一種是語法錯誤,另一種則是異常。typeError還有很多其他異常的類型如 keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常
  • python教程之九錯誤和異常處理
    Python 有兩種錯誤很容易辨認:語法錯誤和異常。語法錯誤語法分析器指出了出錯的一行,並且在最先找到的錯誤的位置標記了顏色,如下所示。 異常Python 程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱為異常。
  • 說說在Python中如何處理異常!
    異常處理在任何一門程式語言裡都是值得關注的一個話題,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你快速修復問題。在Python中,和不部分高級語言一樣,使用了try/except/finally語句塊來處理異常,如果你有其他程式語言的經驗,實踐起來並不難。
  • Python 的 with 語句
    print line        # ...more code不管在處理文件過程中是否發生異常,都能保證with語句執行完之後關閉文件句柄。__exit__exc = True # True 表示正常執行,即便有異常也忽略;False 表示重新拋出異常,需要對異常進行處理try:    try:        target = value # 如果使用了as子句        with-body # 執行with-body    except:    # 執行過程中有異常發生    exc = False    # 如果 __exit_
  • Python小課堂|錯誤和異常
    try 語句按照如下方式工作:1.首先,執行 try 子句(在關鍵字 try 和關鍵字 except 之間的語句)。2.如果沒有異常發生,忽略 except 子句,try 子句執行後結束。3.如果在執行 try 子句的過程中發生了異常,那麼 try 子句餘下的部分將被忽略。
  • Python異常處理,告別xxxxError
    這個提前預防的動作稱為異常處理(exception handling)。總之異常處理就是為了防患於未然。本帖的內容如下:try-excepttry-except-elsetry-except-else-finally拋出 Exception總結異常處理最常見的語句就是 try-except 組合,細分又有三種類型:知道錯誤但不確定類型,
  • 深入Python異常處理
    typeError還有很多其他異常的類型如keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。
  • 十、python基礎之異常處理結構與程序調試方法
    實驗目的:學習python的異常處理和程序調試實驗環境:已正確安裝python3.51、異常的基本概念異常是指程序運行時引發的錯誤,得不到正確的處理將會導致程序終止運行合理地使用異常處理結構可以使得程序更加健壯,具有更強的容錯性。例如:最常見的除數為0,python會拋出「ZeroDivisionError"異常。
  • python妙招-異常處理之try-except
    Python中檢測處理異常是非常重要的,這可以增加代碼的健壯性,我們在寫python程序的時候,會可能會遇到一些不可預料的情況,一旦遇到這些情況,運行時程序便可能會崩潰。比如:讀寫文件時候文件打開錯誤或者文件寫入錯誤,寫爬蟲時網絡請求失敗,返回錯誤404.再或者函數處理一些不確定參數時候,都可以用到異常捕獲。
  • Python系列特別篇-錯誤和異常
    在執行時檢測到的錯誤被稱為 異常,異常並不致命,但我們仍然需要學會處理它。結合上面的例子,我們梳理一下try 語句的工作原理:執行 try 子句(語句塊) :try 和 except 關鍵字之間的語句如果沒有異常發生,則執行完 try 語句,並跳過 except 子句 。如果在執行 try 子句時發生了異常,則跳過該子句中剩下的部分。
  • 十七、深入Python異常處理
    typeError還有很多其他異常的類型如keyError 字典的鍵找不到和FileNotFoundError 文件不存在try except使用Python的異常處理語句,可以非常優雅地處理發生的異常。
  • Python 異常處理
    這時候,就需要捕獲處理它,否則程序會終止執行。異常處理使用 try/except/finally 語句進行捕獲操作, 並告訴 Python 發生異常時如何處理。首先,檢測 try 語句塊中的錯誤,except 語句捕獲異常信息並處理。如果在 try 子句執行時沒有發生異常,Python 將執行 else 語句後的語句,然後控制流通過整個 try 語句。
  • 使用Python提供的raise語句主動拋出異常
    使用raise語句主動拋出異常的意思是開發者可以自己製造程序異常,這裡的程序異常不是指發生了內存溢出、列表越界訪問等系統異常,而是指程序在執行過程中,發生了用戶輸入的數據與要求數據不符、用戶操作錯誤等問題,這些問題都需要程序進行處理並給出相應的提示。