Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #197560

Re: Drop into REPL when your program crashes.

From Annada Behera <annada@tilde.green>
Newsgroups comp.lang.python
Subject Re: Drop into REPL when your program crashes.
Date 2025-09-09 11:53 +0530
Organization tilde.green
Message-ID <dd0c78b502c029e8fb7005edc8ad4b6e9f6ee168.camel@tilde.green> (permalink)
References <7a0dbcc10639dce0c40a6c4b3972f19bde2fc14e.camel@tilde.green> <debugging-20250908133058@ram.dialup.fu-berlin.de>

Show all headers | View raw


So, ipdb is the ipython version of pdb. In fact, post_mortem is a
pdb function. I use ipdb because its REPL is a bit nicer to work
with then pdb.

-----Original Message-----
From: Stefan Ram <ram@zedat.fu-berlin.de>
Subject: Re: Drop into REPL when your program crashes.
Date: 09/08/2025 06:04:16 PM
Newsgroups: comp.lang.python

Annada Behera <annada@tilde.green> 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) 

  .

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Drop into REPL when your program crashes. Annada Behera <annada@tilde.green> - 2025-09-08 16:37 +0530
  Re: Drop into REPL when your program crashes. ram@zedat.fu-berlin.de (Stefan Ram) - 2025-09-08 12:34 +0000
    Re: Drop into REPL when your program crashes. Annada Behera <annada@tilde.green> - 2025-09-09 11:53 +0530
  Re: Drop into REPL when your program crashes. Ethan Carter <ec1828@somewhere.edu> - 2025-09-08 21:21 -0300

csiph-web