-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
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
Conversation
lib/matplotlib/cbook.py
Outdated
@@ -32,6 +32,15 @@ | |||
from matplotlib import _api, _c_internal_utils | |||
|
|||
|
|||
class _ExceptionProxy: |
There was a problem hiding this comment.
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:
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, done.
lib/matplotlib/cbook.py
Outdated
self._cls = cls | ||
self._args = args | ||
|
||
def exception(self): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
def exception(self): | |
def to_exception(self): |
which then reads raise exc_info.to_exception()
.
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).
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