Skip to content

Re-fix exception caching in dviread. - #28906

Merged
QuLogic merged 1 commit into
matplotlib:mainfrom
anntzer:tb2
Oct 2, 2024
Merged

QuLogic merged 1 commit into
matplotlib:mainfrom
anntzer:tb2

Conversation

@anntzer

@anntzer anntzer commented Sep 29, 2024

Copy link
Copy Markdown
Contributor

The original solution using with_traceback didn't actually work because with_traceback doesn't return a new exception instance but rather modifies the original one in place, and the traceback will then be attached to it by the raise statement.

Instead, we actually need to build a new instance, so reuse the _ExceptionProxy machinery from font_manager (slightly expanded).

Redo of #28899; sorry about that...

PR summary

PR checklist

Comment thread lib/matplotlib/cbook.py Outdated
from matplotlib import _api, _c_internal_utils


class _ExceptionProxy:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naming: This is not exactly a proxy. "A proxy is an interface to something else" (wikipedia). This class is not an interface.

Maybe _ExceptionInfo or _ExceptionPlaceholder would be a better name.

Also a docstring would be helpful. Maybe:

Suggested change
class _ExceptionProxy:
class _ExceptionInfo:
"""
A class to carry exception information around.
This is used to store and later raise exceptions. It's an alternative to directly storing
Exception instances and circumvents traceback-related issues. Caching tracebacks
can keep user's objects in local namespaces alive indefinitely. This can lead to very
surprising memory issues for users and will result in incorrect tracebacks.

You might even add a classmethod from_exception(exc) for convenience.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, done.

Comment thread lib/matplotlib/cbook.py Outdated
self._cls = cls
self._args = args

def exception(self):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
def exception(self):
def to_exception(self):

which then reads raise exc_info.to_exception().

@QuLogic QuLogic added this to the v3.10.0 milestone Oct 1, 2024
The original solution using with_traceback didn't actually work because
with_traceback doesn't return a new exception instance but rather
modifies the original one in place, and the traceback will then be
attached to it by the raise statement.

Instead, we actually need to build a new instance, so reuse the
_ExceptionProxy machinery from font_manager (slightly expanded).
@QuLogic
QuLogic merged commit 03483c2 into matplotlib:main Oct 2, 2024
@anntzer
anntzer deleted the tb2 branch October 3, 2024 06:32
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.

4 participants