Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pyflyby-dbg: Support chained exceptions #381

Merged
merged 2 commits into from
Dec 5, 2024

Conversation

umairanis03
Copy link
Contributor

This commit adds support of stepping through chained exceptions with pyflyby debugger.

$ cat chained_exc.py
-------------------------------------------------------------
def inner():
    raise ValueError("inner")

def outer():
    try:
        inner()
    except Exception as e:
        raise ValueError("outer") from e

if __name__ == "__main__":
    outer()

--------------------------------------------------------------------------
$ py /u/anis/scratch/chained_exc.py
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/scratch/chained_exc.py:6, in outer()
      5 try:
----> 6     inner()
      7 except Exception as e:

File ~/scratch/chained_exc.py:2, in inner()
      1 def inner():
----> 2     raise ValueError("inner")

ValueError: inner

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
File ~/scratch/chained_exc.py:11
      8         raise ValueError("outer") from e
     10 if __name__ == "__main__":
---> 11     outer()

File ~/scratch/chained_exc.py:8, in outer()
      6     inner()
      7 except Exception as e:
----> 8     raise ValueError("outer") from e

ValueError: outer
> /u/anis/scratch/chained_exc.py(8)outer()
      6         inner()
      7     except Exception as e:
----> 8         raise ValueError("outer") from e
      9
     10 if __name__ == "__main__":

ipdb> exceptions
    0 ValueError('inner')
>   1 ValueError('outer')

The support uses native Ipython's debugger or python's pdb support for chained exceptions and is available with exceptions command under ipdb/pdb command prompt.

Implementation notes

Starting Py3.13, pdb.interaction() supports chained exceptions in case exception (and not traceback) is specified. This support is backported to IPython8.16 for earlier Python versions. So the conditions where chained exceptions won't be supported from pyflyby's debugger would be with Python version < 3.13 and ipython is not being installed, or IPython's version is lesser than 8.16.

Ref: PyInf#14001
Reviewer: dhamodha

This commit adds support of stepping through chained exceptions with
pyflyby debugger.

```
$ cat chained_exc.py
-------------------------------------------------------------
def inner():
    raise ValueError("inner")

def outer():
    try:
        inner()
    except Exception as e:
        raise ValueError("outer") from e

if __name__ == "__main__":
    outer()

--------------------------------------------------------------------------
$ py /u/anis/scratch/chained_exc.py
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~/scratch/chained_exc.py:6, in outer()
      5 try:
----> 6     inner()
      7 except Exception as e:

File ~/scratch/chained_exc.py:2, in inner()
      1 def inner():
----> 2     raise ValueError("inner")

ValueError: inner

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
File ~/scratch/chained_exc.py:11
      8         raise ValueError("outer") from e
     10 if __name__ == "__main__":
---> 11     outer()

File ~/scratch/chained_exc.py:8, in outer()
      6     inner()
      7 except Exception as e:
----> 8     raise ValueError("outer") from e

ValueError: outer
> /u/anis/scratch/chained_exc.py(8)outer()
      6         inner()
      7     except Exception as e:
----> 8         raise ValueError("outer") from e
      9
     10 if __name__ == "__main__":

ipdb> exceptions
    0 ValueError('inner')
>   1 ValueError('outer')
```

The support uses native Ipython's debugger or python's pdb support for
chained exceptions and is available with `exceptions` command under
ipdb/pdb command prompt.

Implementation notes
=============================================================

Starting Py3.13, pdb.interaction() supports chained exceptions in case
exception (and not traceback) is specified. This support is backported
to IPython8.16 for earlier Python versions. So the conditions where
chained exceptions won't be supported from pyflyby's debugger would be with Python
version < 3.13 and ipython is not being installed, or IPython's version is
lesser than 8.16.

Ref: PyInf#14001
Reviewer: dhamodha
@umairanis03
Copy link
Contributor Author

@dshivashankar1994 Could you please review the change here?

lib/python/pyflyby/_dbg.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_dbg.py Outdated Show resolved Hide resolved
@umairanis03
Copy link
Contributor Author

Thanks for the comments @Carreau. I will address them.

@umairanis03
Copy link
Contributor Author

@Carreau I have addressed the comments. Please have a look.

@umairanis03
Copy link
Contributor Author

@Carreau Please merge the change as well if it looks good to you.

@Carreau Carreau merged commit c73b22c into deshaw:master Dec 5, 2024
7 checks passed
@Carreau
Copy link
Collaborator

Carreau commented Dec 5, 2024

Thanks.

saharan-deshaw pushed a commit that referenced this pull request Dec 6, 2024
Major changes:

- Bug fix introduced as part of #379
- Enhanced pyflyby debugger to support chained exceptions (#381)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants