Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: ram@zedat.fu-berlin.de (Stefan Ram) Newsgroups: comp.lang.python Subject: Re: Drop into REPL when your program crashes. Date: 8 Sep 2025 12:34:16 GMT Organization: Stefan Ram Lines: 71 Expires: 1 Jun 2026 11:59:58 GMT Message-ID: References: <7a0dbcc10639dce0c40a6c4b3972f19bde2fc14e.camel@tilde.green> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de HdeQiMacyIrzqcAdk3rx0g87SaJfmRlnvmntxk7N0h623H Cancel-Lock: sha1:64eT+MA7MIHTKFoHJs71eGwfrpY= sha256:qXzZJghUdR7gUcbExvIK3bzlfECSaA4fR2GtWCyVL98= X-Copyright: (C) Copyright 2025 Stefan Ram. All rights reserved. Distribution through any means other than regular usenet channels is forbidden. It is forbidden to publish this article in the Web, to change URIs of this article into links, and to transfer the body without this notice, but quotations of parts in other Usenet posts are allowed. X-No-Archive: Yes Archive: no X-No-Archive-Readme: "X-No-Archive" is set, because this prevents some services to mirror the article in the web. But the article may be kept on a Usenet archive server with only NNTP access. X-No-Html: yes Content-Language: en Xref: csiph.com comp.lang.python:197558 Annada Behera wrote or quoted: >Recently I have been increasingly adding this piece of code as >a preamble to a lot of my code. > > import (sys, os, ipdb) > > def debug_hook(exc_type, exc_value, traceback): > if exc_type is KeyboardInterrupt: > sys.__excepthook__(exc_type, exc_value, traceback) > return > print(f"Uncaught exception: {exc_type.__name__}: {exc_value}") > ipdb.post_mortem(traceback) > > if os.environ.get('DEBUG'): sys.excepthook = debug_hook Thanks! I have changed it a bit to work without "ipdb" and added demo code. import sys import os import pdb i = 1 def debug_exception_hook(exc_type, exc_value, tb): i = 2 if issubclass(exc_type, KeyboardInterrupt): # Call the default excepthook for KeyboardInterrupt to allow clean exit sys.__excepthook__(exc_type, exc_value, tb) return print(f"Uncaught exception: {exc_type.__name__}: {exc_value}") pdb.post_mortem(tb) def cause_exception(): # Function to demonstrate an unhandled exception i = 3 return 1 / 0 # Will raise ZeroDivisionError def f(): # Function to demonstrate an unhandled exception i = 4 cause_exception() return i if __name__ == "__main__": # demo code import os; os.environ['DEBUG'] = 'true' if os.environ.get('DEBUG'): sys.excepthook = debug_exception_hook print("Debug mode enabled: Using pdb post-mortem on uncaught exceptions.") else: print("Debug mode not enabled: Regular exception handling.") # Run demo to trigger exception i = 5 f() Then, I got this dialog: Debug mode enabled: Using pdb post-mortem on uncaught exceptions. Uncaught exception: ZeroDivisionError: division by zero > debug_hook.py(19)cause_exception() -> return 1 / 0 # Will raise ZeroDivisionError (Pdb) i 3 (Pdb) .