Skip to content

Commit

Permalink
Handle OSError cases where traceback frames occur from built files (#…
Browse files Browse the repository at this point in the history
…13964)


 I've been using the `_render_traceback_` method of the traceback object, provided by the
`IPython.core.interactiveshell.InteractiveShell` object that you
created, in the `showtraceback` method. Thanks to this, I was able to
create better error messages. I appreciate it. The following issue is
related to the use of this method.
```python
                    try:
                        # Exception classes can customise their traceback - we
                        # use this in IPython.parallel for exceptions occurring
                        # in the engines. This should return a list of strings.
                        if hasattr(value, "_render_traceback_"):
                            stb = value._render_traceback_()
                        else:
                            stb = self.InteractiveTB.structured_traceback(
                                etype, value, tb, tb_offset=tb_offset
                            )
```


I noticed that in the recent `8.11` version, code was added to generate
a traceback when the source code is too long. In this case, if the
`etb.tb_frame` object is a built file or something similar, the
`inspect.getsourcelines(etb.tb_frame)` method may raise an error. So I
implemented a change to set the `max_len` to the minimum value and avoid
the following condition when an `OSError` occurs. I think this approach
can handle cases where errors occur while using the
`inspect.getsourcelines()` method.

If there is anything I have done wrong or any procedures I should
follow, please let me know. I would greatly appreciate it if you could
leave a comment and I will make the necessary changes immediately. Thank
you.
  • Loading branch information
Carreau committed Mar 30, 2023
2 parents c14f840 + 0aed535 commit 9202708
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions IPython/core/ultratb.py
Original file line number Diff line number Diff line change
Expand Up @@ -1017,8 +1017,12 @@ def get_records(
max_len = 0
tbs = []
while cf is not None:
source_file = inspect.getsourcefile(etb.tb_frame)
lines, first = inspect.getsourcelines(etb.tb_frame)
try:
source_file = inspect.getsourcefile(etb.tb_frame)
lines, first = inspect.getsourcelines(etb.tb_frame)
except OSError:
max_len = float("-inf")
break
max_len = max(max_len, first + len(lines))
tbs.append(cf)
cf = cf.tb_next
Expand Down

0 comments on commit 9202708

Please sign in to comment.