Skip to content

Re-fix exception caching in dviread. #28906

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

Merged
merged 1 commit into from
Oct 2, 2024
Merged

Re-fix exception caching in dviread. #28906

merged 1 commit into from
Oct 2, 2024

Conversation

anntzer
Copy link
Contributor

@anntzer anntzer commented Sep 29, 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).

Redo of #28899; sorry about that...

PR summary

PR checklist

@@ -32,6 +32,15 @@
from matplotlib import _api, _c_internal_utils


class _ExceptionProxy:
Copy link
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
Contributor Author

Choose a reason for hiding this comment

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

Sure, done.

self._cls = cls
self._args = args

def exception(self):
Copy link
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
38 of 43 checks passed
@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