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里,最直接的方法就是使用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,它能將異常信息轉換為一個字符串列表,方便我們進行后續處理。當然,你也可以根據自己的需求,添加更多的格式化邏輯,比如高亮顯示關鍵信息。
使用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用于記錄錯誤信息。