Ce face sys.exception(), exc_info(), excepthook și unraisablehook
În interiorul unui bloc except, sys.exception() (3.11+) returnează excepția curentă, iar sys.exc_info() tuplul mai vechi (tip, valoare, traceback). În afara unui except, returnează None, respectiv (None, None, None).
sys.excepthook este funcția apelată pentru o excepție neprinsă, înainte ca programul să se oprească; o poți înlocui ca să trimiți erorile într-un jurnal sau un serviciu de monitorizare. sys.unraisablehook primește erorile care nu pot fi aruncate mai departe, de exemplu din metoda __del__.
Ce returnează
Excepția curentă, un tuplu sau None.
Exemple
Exemplul 1: Excepția curentă
import sys
print(sys.exception(), sys.exc_info())
try:
{}["lipsa"]
except KeyError:
e = sys.exception()
tip, valoare, tb = sys.exc_info()
print(repr(e), tip.__name__, valoare is e, tb.tb_lineno)
Rezultat
None (None, None, None)
KeyError('lipsa') KeyError True 4
Exemplul 2: Înlocuirea funcțiilor pentru erori neprinse
import sys
def jurnal_erori(tip, valoare, tb):
print(f"[jurnal] {tip.__name__}: {valoare}")
sys.excepthook = jurnal_erori
try:
1 / 0
except ZeroDivisionError:
sys.excepthook(*sys.exc_info())
def la_del(info):
print("[unraisable]", type(info.exc_value).__name__, info.exc_value, "| în __del__:", "deallocator" in info.err_msg)
sys.unraisablehook = la_del
class Resursa:
def __del__(self):
raise RuntimeError("curățare eșuată")
r = Resursa()
del r
Rezultat
[jurnal] ZeroDivisionError: division by zero
[unraisable] RuntimeError curățare eșuată | în __del__: True
Greșeli frecvente
- Apelezi
sys.exception()în afara unuiexceptși te aștepți la ultima eroare; returneazăNone.
Comenzi înrudite
try / except / else / finally: Prinde și tratează erorile (excepțiile), ca programul să nu se oprească brusc.raise: Aruncă (semnalează) o excepție, oprind execuția normală până când este prinsă cu except.sys.displayhook și sys.breakpointhook: Funcțiile care afișează rezultatele în consola interactivă și cea apelată de breakpoint().