sys.exception(), exc_info(), excepthook și unraisablehook în Python

Interpretorul (sys) Python 3.0+ (exception: 3.11+, unraisablehook: 3.8+)

Excepția tratată în prezent și funcțiile care se ocupă de erorile neprinse.

Sintaxă
sys.exception()
sys.exc_info()
sys.excepthook = functie(tip, valoare, traceback)
sys.unraisablehook = functie(unraisable)

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 unui except și te aștepți la ultima eroare; returnează None.

Comenzi înrudite