Jupyter Notebook中:如何定制異常可視化輸出格式?

1.在jupyter notebook中,可使用try…except塊捕獲異常,并通過traceback.format_exception格式化異常信息;2.使用ipython.excepthook定義全局異常處理函數custom_exception_handler,設置sys.excepthook實現未捕獲異常的統一處理;3.通過ipython.display.html將異常信息渲染為html,實現高亮顯示效果;4.利用traceback.extract_stack提取信息并限制輸出層數,保留關鍵部分提升可讀性;5.使用Logging模塊配置日志記錄,將異常信息寫入文件以便后續分析。

Jupyter Notebook中:如何定制異常可視化輸出格式?

在Jupyter Notebook中,定制異常的可視化輸出格式,簡單來說,就是讓你看到的報錯信息更清晰、更友好,而不是一堆難以理解的堆棧信息。

Jupyter Notebook中:如何定制異常可視化輸出格式?

定制異常可視化輸出,讓調試更高效。

Jupyter Notebook中:如何定制異常可視化輸出格式?

如何捕獲和格式化異常?

在Jupyter Notebook里,最直接的方法就是使用try…except塊。但僅僅捕獲異常還不夠,我們需要對異常信息進行格式化。可以自定義一個函數,專門用于格式化異常信息,然后在except塊中調用它。

import traceback  def format_exception(e):     """格式化異常信息,使其更易讀。"""     exception_list = traceback.format_exception(None, e, e.__traceback__)     exception_string = "".join(exception_list)     return exception_string  try:     1 / 0 except Exception as e:     formatted_exception = format_exception(e)     print(formatted_exception)

這段代碼的核心在于traceback.format_exception,它能將異常信息轉換為一個字符串列表,方便我們進行后續處理。當然,你也可以根據自己的需求,添加更多的格式化邏輯,比如高亮顯示關鍵信息。

Jupyter Notebook中:如何定制異常可視化輸出格式?

使用IPython.excepthook定制全局異常處理

如果想對所有未捕獲的異常進行統一處理,可以使用IPython.excepthook。這允許你定義一個全局的異常處理函數,當程序出現未捕獲的異常時,會自動調用該函數。

import sys from IPython.core import ultratb  def custom_exception_handler(shell, etype, evalue, tb, tb_offset=None):     """自定義全局異常處理函數。"""     shell.showtraceback((etype, evalue, tb), tb_offset=tb_offset)  # 默認行為     print("發生了一個錯誤!請檢查你的代碼。")  import IPython IPython.get_ipython().pt_show_in_pager = False # 關閉分頁 sys.excepthook = custom_exception_handler

這里,我們首先定義了一個custom_exception_handler函數,它接收異常類型、異常值、堆棧信息等參數。在這個函數里,你可以做任何你想做的事情,比如記錄日志、發送郵件、或者顯示更友好的錯誤提示。然后,我們將sys.excepthook設置為這個自定義函數,這樣,所有的未捕獲異常都會經過它的處理。關閉分頁是為了防止在控制臺輸出過多信息。

如何在Jupyter Notebook中高亮顯示異常信息?

僅僅是格式化異常信息還不夠,如果能高亮顯示關鍵信息,那就更好了。可以使用IPython.display模塊來實現這一點。

from IPython.display import HTML, display  def format_exception_html(e):     """格式化異常信息為HTML,并高亮顯示關鍵信息。"""     exception_list = traceback.format_exception(None, e, e.__traceback__)     exception_string = "".join(exception_list)     # 使用HTML標記高亮顯示     html = f"<pre style='color:red;'>{exception_string}

” return html try: 1 / 0 except Exception as e: html_exception = format_exception_html(e) display(HTML(html_exception))

這段代碼將異常信息格式化為HTML,并使用紅色高亮顯示。IPython.display.HTML可以將HTML代碼渲染到Jupyter Notebook中,從而實現高亮顯示的效果。你可以根據自己的喜好,修改HTML樣式,比如改變顏色、字體、背景等等。

如何在Jupyter Notebook中隱藏部分堆棧信息?

有時候,堆棧信息太長,我們只想看到最關鍵的部分。可以使用traceback模塊的extract_stack函數來提取堆棧信息,并只顯示最后幾層。

import traceback  def format_exception_short(e):     """格式化異常信息,只顯示最后幾層堆棧信息。"""     extracted_stack = traceback.extract_stack()     # 只顯示最后3層堆棧信息     formatted_stack = extracted_stack[-3:]     formatted_lines = traceback.format_list(formatted_stack)     exception_string = "".join(formatted_lines) + repr(e)     return exception_string  try:     def inner_function():         raise ValueError("Something went wrong")     def outer_function():         inner_function()     outer_function() except Exception as e:     formatted_exception = format_exception_short(e)     print(formatted_exception)

這里,我們使用traceback.extract_stack提取堆棧信息,然后只保留最后3層。traceback.format_list將堆棧信息格式化為字符串列表,方便我們進行后續處理。

如何在Jupyter Notebook中記錄異常日志?

除了顯示異常信息,記錄異常日志也是一個好習慣。可以使用logging模塊來實現這一點。

import logging  # 配置日志 logging.basicConfig(filename='error.log', level=logging.ERROR,                     format='%(asctime)s - %(levelname)s - %(message)s')  try:     1 / 0 except Exception as e:     logging.error(f"An error occurred: {e}")     print("An error occurred. See error.log for details.")

這段代碼將異常信息記錄到error.log文件中。logging.basicConfig用于配置日志,可以設置日志文件名、日志級別、日志格式等等。logging.error用于記錄錯誤信息。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享