


Erweitern Sie Ihr Wissen! Auch die Ausnahmeinformationen von Python können so angezeigt werden
Einführung
In der täglichen Entwicklung verbringen wir die meiste Zeit damit, Traceback-Modulinformationen zu lesen und Code zu debuggen. In diesem Artikel verbessern wir das Traceback-Modul, um die Eingabeaufforderungsinformationen prägnanter und genauer zu gestalten.
Basierend auf diesem Zweck werden wir Ausnahme-Hooks (Hooks zur Ausnahmebehandlung) anpassen, um redundante Informationen im Traceback zu entfernen und nur den Inhalt übrig zu lassen, der zur Behebung des Fehlers erforderlich ist. Darüber hinaus werde ich einige nützliche Bibliotheken von Drittanbietern vorstellen, in denen Sie die Ausnahme-Hooks direkt verwenden können, um das Traceback-Modul zu vereinfachen.
Ausnahme-Hooks
Wenn die Ausnahmeinformationen des Programms nicht durch Try/Catch erfasst werden, ruft der Python-Interpreter die Funktion sys.exclushook() auf, die 3 Parameter empfängt: Typ, Wert, Traceback. Diese Funktion wird auch Exception Hook genannt und gibt die Ausnahmeinformationen des Programms aus.
Sehen wir uns das folgende Beispiel an:
import sys def exception_hook(exc_type, exc_value, tb): print('Traceback:') filename = tb.tb_frame.f_code.co_filename name = tb.tb_frame.f_code.co_name line_no = tb.tb_lineno print(f"File {filename} line {line_no}, in {name}") # Exception type 和 value print(f"{exc_type.__name__}, Message: {exc_value}") sys.excepthook = exception_hook
In diesem Beispiel können wir den Speicherort, an dem die Ausnahmeinformationen angezeigt werden, aus dem Traceback-Objekt (tb) abrufen. Die Speicherortinformationen umfassen: Dateiname (f_code.co_filename), Funktions-/Modulname (f_code.co_name) und Zeilennummer (tb_lineno). Darüber hinaus können wir die Variablen exc_type und exc_value verwenden, um den Inhalt der Ausnahmeinformationen abzurufen.
Wenn wir eine Funktion aufrufen, die einen Fehler generiert, gibt Ausnahme_Hook den folgenden Inhalt aus:
def do_stuff(): # 写一段会产生异常的代码 raise ValueError("Some error message") do_stuff() # Traceback: # File /home/some/path/exception_hooks.py line 22, in <module> # ValueError, Message: Some error message
Das obige Beispiel stellt einen Teil der Ausnahmeinformationen bereit, aber um alle Informationen zu erhalten, die zum Debuggen des Codes erforderlich sind, und um zu wissen, wann und wann Wenn die Ausnahme auftritt, müssen wir uns auch mit dem Traceback-Objekt befassen:
def exception_hook(exc_type, exc_value, tb): local_vars = {} while tb: filename = tb.tb_frame.f_code.co_filename name = tb.tb_frame.f_code.co_name line_no = tb.tb_lineno print(f"File {filename} line {line_no}, in {name}") local_vars = tb.tb_frame.f_locals tb = tb.tb_next print(f"Local variables in top frame: {local_vars}") ... # File /home/some/path/exception_hooks.py line 41, in <module> # File /home/some/path/exception_hooks.py line 7, in do_stuff # Local variables in top frame: {'some_var': 'data'}
Wie aus dem obigen Beispiel ersichtlich ist, ist das Traceback-Objekt (tb) im Wesentlichen eine verknüpfte Liste, in der alle auftretenden Ausnahmen gespeichert werden. Daher können Sie tb_next verwenden, um tb zu durchlaufen und die Informationen jeder Ausnahme auszudrucken. Auf dieser Basis können Sie das Attribut tb_frame.f_locals auch verwenden, um Variablen an die Konsole auszugeben, was das Debuggen des Codes erleichtert.
Es ist möglich, das Traceback-Objekt zur Ausgabe von Ausnahmeinformationen zu verwenden, dies ist jedoch problematischer. Außerdem sind die Ausgabeinformationen weniger lesbar. Ein bequemerer Ansatz ist die Verwendung des Traceback-Moduls, das über viele integrierte Hilfsfunktionen zum Extrahieren von Ausnahmeinformationen verfügt.
Jetzt haben wir das Grundwissen über Ausnahme-Hooks eingeführt. Als nächstes können wir einen Ausnahme-Hook anpassen und einige praktische Funktionen hinzufügen.
Benutzerdefinierte Ausnahme-Hooks
- Wir können Ausnahmeinformationen auch automatisch in einer Datei speichern und beim späteren Debuggen des Codes anzeigen:
LOG_FILE_PATH = "./some.log" FILE = open(LOG_FILE_PATH, mode="w") def exception_hook(exc_type, exc_value, tb): FILE.write("*** Exception: ***n") traceback.print_exc(file=FILE) FILE.write("n*** Traceback: ***n") traceback.print_tb(tb, file=FILE) # *** Exception: *** # NoneType: None # # *** Traceback: *** # File "/home/some/path/exception_hooks.py", line 82, in <module> # do_stuff() # File "/home/some/path/exception_hooks.py", line 7, in do_stuff # raise ValueError("Some error message")
- Ausnahmeinformationen werden standardmäßig in stderr gespeichert, wenn Sie die ändern möchten Speicherposition, Sie können dies tun:
import logging logging.basicConfig( level=logging.CRITICAL, format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', datefmt='%H:%M:%S', stream=sys.stdout ) def exception_hook(exc_type, exc_value, exc_traceback): logging.critical("Uncaught exception:", exc_info=(exc_type, exc_value, exc_traceback)) # [17:28:33] {/home/some/path/exception_hooks.py:117} CRITICAL - Uncaught exception: # Traceback (most recent call last): # File "/home/some/path/exception_hooks.py", line 122, in <module> # do_stuff() # File "/home/some/path/exception_hooks.py", line 7, in do_stuff # raise ValueError("Some error message") # ValueError: Some error message
- Wir können auch die Farbe für einen bestimmten Teil der Eingabeaufforderungsnachricht festlegen:
# pip install colorama from colorama import init, Fore init(autoreset=True)# Reset the color after every print def exception_hook(exc_type, exc_value, tb): local_vars = {} while tb: filename = tb.tb_frame.f_code.co_filename name = tb.tb_frame.f_code.co_name line_no = tb.tb_lineno # Prepend desired color (e.g. RED) to line print(f"{Fore.RED}File {filename} line {line_no}, in {name}") local_vars = tb.tb_frame.f_locals tb = tb.tb_next print(f"{Fore.GREEN}Local variables in top frame: {local_vars}")
Zusätzlich zu den oben vorgestellten Beispielen können Sie auch die lokalen Variablen jedes Frames ausgeben , oder suchen Sie die Zeile, in der die Ausnahme auftritt, Variablen, auf die in verwiesen wird. Diese Ausnahme-Hooks sind im Vergleich zu benutzerdefinierten Ausnahme-Hooks bereits sehr ausgereift. Ich empfehle Ihnen, den Quellcode anderer Entwickler zu lesen und sich mit deren Designideen vertraut zu machen.
- Geben Sie die lokalen Variablen jedes Frames aus [1]
- Finden Sie die Variablen, auf die in der Zeile verwiesen wird, in der die Ausnahme auftritt [2]
Ausnahme-Hooks in Bibliotheken von Drittanbietern
Das Anpassen eines Ausnahme-Hooks ist sehr schwierig interessant, aber viele Bibliotheken von Drittanbietern haben diese Funktion bereits implementiert. Anstatt das Rad neu zu erfinden, schauen Sie sich andere großartige Tools an.
- Mein persönlicher Favorit ist zunächst Rich, das direkt mit pip installiert und dann zur Verwendung importiert werden kann. Wenn Sie es nur in einem Beispiel verwenden möchten, können Sie Folgendes tun: python -m rich.traceback
# https://rich.readthedocs.io/en/latest/traceback.html # pip install rich # python -m rich.traceback from rich.traceback import install install(show_locals=True) do_stuff()# Raises ValueError
- Better_Exceptions sind ebenfalls sehr beliebt. Wir müssen zuerst die Umgebungsvariable BETTER_EXCEPTIONS = 1 und dann festlegen Installiere es mit pip. Wenn Ihre TERM-Variable nicht xterm ist, setzen Sie SUPPORTS_COLOR außerdem auf True.
# https://github.com/Qix-/better-exceptions # pip install better_exceptions # export BETTER_EXCEPTIONS=1 import better_exceptions better_exceptions.MAX_LENGTH = None # 检查你的 TERM 变量是否被设置为 `xterm`, 如果没有执行以下操作 # See issue: https://github.com/Qix-/better-exceptions/issues/8 better_exceptions.SUPPORTS_COLOR = True better_exceptions.hook() do_stuff()# Raises ValueError
- Die bequemste zu verwendende Bibliothek ist Pretty_errors. Importieren Sie sie einfach:
# https://github.com/onelivesleft/PrettyErrors/ # pip install pretty_errors import pretty_errors # 如果你对默认配置满意的话,则无需修改 pretty_errors.configure( filename_display= pretty_errors.FILENAME_EXTENDED, line_number_first = True, display_link= True, line_color= pretty_errors.RED + '> ' + pretty_errors.default_config.line_color, code_color= '' + pretty_errors.default_config.line_color, truncate_code = True, display_locals= True ) do_stuff()
Zusätzlich zum direkten Import zeigt der obige Code auch einige optionale Konfigurationen dieser Bibliothek. Weitere Konfigurationen können hier eingesehen werden: Konfiguration [3]
- IPythons Ultratb-Modul
# https://ipython.readthedocs.io/en/stable/api/generated/IPython.core.ultratb.html # pip install ipython import IPython.core.ultratb # Also ColorTB, FormattedTB, ListTB, SyntaxTB sys.excepthook = IPython.core.ultratb.VerboseTB(color_scheme='Linux')# Other colors: NoColor, LightBG, Neutral do_stuff()
- stackprinter库
# https://github.com/cknd/stackprinter # pip install stackprinter import stackprinter stackprinter.set_excepthook(style='darkbg2') do_stuff()
结论
本文我们学习了如何自定义Exception Hooks,但我更推荐使用第三方库。你可以在本文介绍的第三方库中任选一个喜欢的,用到项目中。需要注意的是使用自定义Exception Hooks可能会丢失某些关键信息,例如:本文中的某些例子中,输出中缺少文件路径,在远程调试代码这无疑很不方便,因此,需要谨慎使用。
Das obige ist der detaillierte Inhalt vonErweitern Sie Ihr Wissen! Auch die Ausnahmeinformationen von Python können so angezeigt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

VS -Code kann zum Schreiben von Python verwendet werden und bietet viele Funktionen, die es zu einem idealen Werkzeug für die Entwicklung von Python -Anwendungen machen. Sie ermöglichen es Benutzern: Installation von Python -Erweiterungen, um Funktionen wie Code -Abschluss, Syntax -Hervorhebung und Debugging zu erhalten. Verwenden Sie den Debugger, um Code Schritt für Schritt zu verfolgen, Fehler zu finden und zu beheben. Integrieren Sie Git für die Versionskontrolle. Verwenden Sie Tools für die Codeformatierung, um die Codekonsistenz aufrechtzuerhalten. Verwenden Sie das Lining -Tool, um potenzielle Probleme im Voraus zu erkennen.

VS -Code -Erweiterungen stellen böswillige Risiken dar, wie das Verstecken von böswilligem Code, das Ausbeutetieren von Schwachstellen und das Masturbieren als legitime Erweiterungen. Zu den Methoden zur Identifizierung böswilliger Erweiterungen gehören: Überprüfung von Verlegern, Lesen von Kommentaren, Überprüfung von Code und Installation mit Vorsicht. Zu den Sicherheitsmaßnahmen gehören auch: Sicherheitsbewusstsein, gute Gewohnheiten, regelmäßige Updates und Antivirensoftware.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

VS -Code kann unter Windows 8 ausgeführt werden, aber die Erfahrung ist möglicherweise nicht großartig. Stellen Sie zunächst sicher, dass das System auf den neuesten Patch aktualisiert wurde, und laden Sie dann das VS -Code -Installationspaket herunter, das der Systemarchitektur entspricht und sie wie aufgefordert installiert. Beachten Sie nach der Installation, dass einige Erweiterungen möglicherweise mit Windows 8 nicht kompatibel sind und nach alternativen Erweiterungen suchen oder neuere Windows -Systeme in einer virtuellen Maschine verwenden müssen. Installieren Sie die erforderlichen Erweiterungen, um zu überprüfen, ob sie ordnungsgemäß funktionieren. Obwohl VS -Code unter Windows 8 möglich ist, wird empfohlen, auf ein neueres Windows -System zu upgraden, um eine bessere Entwicklungserfahrung und Sicherheit zu erzielen.

Im VS -Code können Sie das Programm im Terminal in den folgenden Schritten ausführen: Erstellen Sie den Code und öffnen Sie das integrierte Terminal, um sicherzustellen, dass das Codeverzeichnis mit dem Terminal Working -Verzeichnis übereinstimmt. Wählen Sie den Befehl aus, den Befehl ausführen, gemäß der Programmiersprache (z. B. Pythons Python your_file_name.py), um zu überprüfen, ob er erfolgreich ausgeführt wird, und Fehler auflösen. Verwenden Sie den Debugger, um die Debugging -Effizienz zu verbessern.
