處理 Python 斷言錯誤並查詢錯誤源

Shikha Chaudhary 2023年1月30日
  1. 在 Python 中處理斷言錯誤並查詢錯誤源
  2. 使用 Try-Except 塊處理 Python 中的斷言錯誤
  3. 使用帶有 Try-Except 塊的日誌記錄模組來處理 Python 中的斷言錯誤
  4. 使用 Traceback 模組處理 Python 中的斷言錯誤
  5. 在 Python 中使用 print 語句手動處理 AssertionError 異常
  6. まとめ
處理 Python 斷言錯誤並查詢錯誤源

在本文中,我們將學習如何以不同的方式處理 Python 的斷言錯誤。我們還看到了識別引發此錯誤的語句的方法。

在 Python 中處理斷言錯誤並查詢錯誤源

在 Python 中,我們可以使用 assert 語句來檢查程式碼中的任何條件。如果條件為 True,則控制更進一步。

但是如果條件結果為 False,我們就會得到 AssertionError,程式的流程就會被打亂。

assert 語句的語法如下。

assert statement, message

這裡,statement 是一個布林語句。如果它評估為 False,程式將引發 AssertionError

message 是可選的,並在 AssertionError 發生時列印。如果 statement 的計算結果為 True,則什麼也不會發生。

這就是 Python 引發 AssertionError 異常的方式。

assert True == False, "Whoops, something went wrong!"
print(True)

輸出:

Traceback (most recent call last):
  File "Desktop/Tut.py", line 2, in <module>
    assert True == False, "Whoops, something went wrong!"
AssertionError: Whoops, something went wrong!

你可以觀察到我們使用了語句 True==False,其計算結果為 False。因此,程式會引發 AssertionError 異常。

我們可以通過多種方式處理此異常。讓我們一個接一個地瀏覽它們。

使用 Try-Except 塊處理 Python 中的斷言錯誤

嘗試執行以下程式碼。

try:
    assert 123 == 256432
except AssertionError:
    print("There is some problem!")

輸出:

There is some problem!

在這裡,assert 語句檢查兩個數字是否相等。由於這些數字不相等,AssertionError 異常從 try 塊引發。

except 塊捕獲異常並執行列印語句。在這裡,我們在異常塊的 print 語句中獲得了輸出。

要知道異常的來源在哪裡,我們可以使用 raise 關鍵字在 except 塊中重新引發異常。

raise 關鍵字將在出現異常時引發錯誤並停止程式。它有助於跟蹤當前的異常。

raise 語句的語法如下。

raise {exception class}

異常可以是內建異常,我們也可以建立自定義異常。我們還可以使用 raise 關鍵字列印一些訊息並建立自定義異常。

raise Exception("print some string")

這個例子展示了 raise 關鍵字的工作原理。

try:
    assert 1 == 2
except AssertionError:
    print("There is some problem!")
    raise

輸出:

There is some problem!
Traceback (most recent call last):
  File "Desktop/Tut.py", line 2, in <module>
    assert 1 == 2
AssertionError

我們在上面程式碼的 except 塊中重新引發了異常。你可以觀察使用 raise 關鍵字如何在 line 2 中給出異常源。

通過這種方式,我們可以獲得異常的行號以及引發程式碼的確切錯誤部分。

使用帶有 Try-Except 塊的日誌記錄模組來處理 Python 中的斷言錯誤

Python 中的 logging 模組可幫助你跟蹤應用程式的執行和錯誤。該模組跟蹤任何操作期​​間發生的事件。

這在發生崩潰時很有幫助,因為我們可以從日誌中找到以前的資料。因此,如果出現任何問題,我們可以回顧並找出導致錯誤的原因。

我們可以匯入 logging 模組並在 except 塊中使用 logging.error 方法。

import logging

try:
    assert True == False
except AssertionError:
    logging.error("Something is quite not right!", exc_info=True)

輸出:

ERROR:root:Something is quite not right!
Traceback (most recent call last):
  File "Desktop/Tut.py", line 4, in <module>
    assert True == False
AssertionError

此方法還返回異常的行號和確切來源。

該模組有許多物件用於不同型別的錯誤訊息。這些物件在記錄器上記錄具有級別的訊息。

例如,Logger.critical(message) 記錄具有 critical 級別的訊息。Logger.error(message) 在上面的程式碼中記錄級別 error 的訊息。

使用 Traceback 模組處理 Python 中的斷言錯誤

當程式碼有多個斷言語句時,traceback 模組有助於捕捉錯誤的確切來源。

import sys
import traceback

try:
    assert 88 == 88
    assert 1 == 101
    assert True

except AssertionError:
    _, _, var = sys.exc_info()
    traceback.print_tb(var)
    tb_info = traceback.extract_tb(var)
    filename, line_number, function_name, text = tb_info[-1]

    print(
        "There is some error in line {} in this statement: {}".format(line_number, text)
    )
    exit(1)

輸出:

File "Desktop/Tut.py", line 6, in <module>
    assert 1 == 101
There is some error in line 6 in this statement:  assert 1 == 101

使用 traceback 模組,我們可以編寫帶有佔位符 {}print 語句。

此外,我們可以指定不同的變數來儲存檔名、行號、函式名和發生異常的文字。

這裡,tb 指的是回溯物件。我們在 print 語句中只使用了兩個佔位符,一個用於行號,另一個用於文字。

sys.exc_info() 函式返回 raise 語句的三個部分 - exc_typeexc_tracebackexc_value。讓我們在檔名的 print 語句中放置另一個佔位符。

import sys
import traceback

try:
    assert 88 == 88
    assert 1 == 101
    assert True

except AssertionError:
    _, _, var = sys.exc_info()
    traceback.print_tb(var)
    tb_info = traceback.extract_tb(var)
    filename, line_number, function_name, text = tb_info[-1]

    print(
        "There is some error in the file {} on line {} in this statement: {}".format(
            filename, line_number, text
        )
    )
    exit(1)

輸出:

File "Desktop/Tut.py", line 6, in <module>
    assert 1 == 101
There is some error in the file Desktop/Tut.py on line 6 in this statement: assert 1 == 101

這次我們還得到了檔案的完整 URL 作為檔名。

有關回溯模組的更多詳細資訊,請參閱此文件

在 Python 中使用 print 語句手動處理 AssertionError 異常

我們可以在 except 塊中使用 print 語句來手動處理異常。

try:
    assert True == False, "Operation is invalid"
    print(True)

except AssertionError as warn:
    print(warn)

輸出:

Operation is invalid

使用者提供的任何錯誤訊息都會進入 print 語句並被列印出來。這樣,使用者就不必擔心技術錯誤。

顯示一個簡單的訊息而不是錯誤。

まとめ

本文展示了我們如何在 Python 中處理 AssertionError。我們討論了使用 raise 關鍵字、日誌記錄模組和回溯模組來處理斷言錯誤。

我們還看到了如何使用簡單的列印語句手動處理 AssertionError 異常。在實際應用中,不使用 AssertionError

如果你僅在開發和測試程式時使用它會有所幫助。

相關文章 - Python Error