@@ -66,26 +66,30 @@ internal static Exception ThrowLastAsClrException()
66
66
IntPtr gs = PythonEngine . AcquireLock ( ) ;
67
67
try
68
68
{
69
- Runtime . PyErr_Fetch ( out var pyTypeHandle , out var pyValueHandle , out var pyTracebackHandle ) ;
69
+ Runtime . PyErr_Fetch ( out var type , out var value , out var traceback ) ;
70
70
try
71
71
{
72
- var clrObject = ManagedType . GetManagedObject ( pyValueHandle ) as CLRObject ;
73
- if ( clrObject ? . inst is Exception e )
74
- {
72
+ var clrObject = ManagedType . GetManagedObject ( value ) as CLRObject ;
75
73
#if NETSTANDARD
76
- ExceptionDispatchInfo . Capture ( e ) . Throw ( ) ;
74
+ if ( clrObject ? . inst is ExceptionDispatchInfo storedException )
75
+ {
76
+ storedException . Throw ( ) ;
77
+ throw storedException . SourceException ; // unreachable
78
+ }
77
79
#endif
80
+ if ( clrObject ? . inst is Exception e )
81
+ {
78
82
throw e ;
79
83
}
80
84
81
- var result = FromPyErr ( pyTypeHandle , pyValueHandle , pyTracebackHandle ) ;
85
+ var result = FromPyErr ( type , value , traceback ) ;
82
86
throw result ;
83
87
}
84
88
finally
85
89
{
86
- pyTypeHandle . Dispose ( ) ;
87
- pyValueHandle . Dispose ( ) ;
88
- pyTracebackHandle . Dispose ( ) ;
90
+ type . Dispose ( ) ;
91
+ value . Dispose ( ) ;
92
+ traceback . Dispose ( ) ;
89
93
}
90
94
}
91
95
finally
@@ -108,6 +112,13 @@ static Exception FromPyErr(BorrowedReference typeHandle, BorrowedReference value
108
112
return e ;
109
113
}
110
114
115
+ #if NETSTANDARD
116
+ if ( clrObject ? . inst is ExceptionDispatchInfo exceptionDispatchInfo )
117
+ {
118
+ return exceptionDispatchInfo . SourceException ;
119
+ }
120
+ #endif
121
+
111
122
var type = PyObject . FromNullableReference ( typeHandle ) ;
112
123
var value = PyObject . FromNullableReference ( valueHandle ) ;
113
124
var traceback = PyObject . FromNullableReference ( tracebackHandle ) ;
0 commit comments