充分利用IronPython的例外情况的跟踪信息
-
13-09-2019 - |
题
我有我的IronPython应用程序内托管,每当我搭上从脚本抛出的异常,我得到无益乱码这样的:
IronPython.NewTypes.System.Exception_1$1: Error occurred during conversion ---> Microsoft.Scripting.ArgumentTypeException: expected int, got DispMethod
at _stub_$245##245(Closure , CallSite , Object )
at Microsoft.Scripting.Actions.MatchCaller.Call1[T0,TRet](Func`3 target, CallSite site, Object[] args)
at Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[] args)
at Microsoft.Scripting.Actions.UpdateDelegates.Update1[T,T0,TRet](CallSite site, T0 arg0)
at _stub_$227##227(Closure , CallSite , Object )
at IronPython.Runtime.Converter.Convert(Object value, Type to)
at IronPython.Runtime.Operations.ArrayOps.SetItem(Array data, Int32 index, Object value)
at _stub_$244##244(Closure , CallSite , Object , Object , Object )
at Microsoft.Scripting.Actions.MatchCaller.Call3[T0,T1,T2,TRet](Func`5 target, CallSite site, Object[] args)
at Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[] args)
at Microsoft.Scripting.Actions.UpdateDelegates.Update3[T,T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
at ConvertToFgf$223##223(Closure , Object , Object , Object )
at _stub_$192##192(Closure , CallSite , CodeContext , Object , Object , Object , Object )
at Microsoft.Scripting.Actions.MatchCaller.Call5[T0,T1,T2,T3,T4,TRet](Func`7 target, CallSite site, Object[] args)
at Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[] args)
at Microsoft.Scripting.Actions.UpdateDelegates.Update5[T,T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
at Convert$224##224(Closure , Object , Object )
--- End of inner exception stack trace ---
at Convert$224##224(Closure , Object , Object )
at _stub_$42##42(Closure , CallSite , CodeContext , Object , Object , Object )
at Microsoft.Scripting.Actions.MatchCaller.Call4[T0,T1,T2,T3,TRet](Func`6 target, CallSite site, Object[] args)
at Microsoft.Scripting.Actions.CallSite`1.UpdateAndExecute(Object[] args)
at Microsoft.Scripting.Actions.UpdateDelegates.Update4[T,T0,T1,T2,T3,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
at Run$225##225(Closure )
我想获得的反而是蟒蛇回溯。反正是有得到这些信息?
解决方案
如果你只需要一个文本版本,你可以这样做:
engine.GetService<ExceptionOperations>().FormatException(exception);
如果你真的需要Python的追溯对象,我建议:
Func<PythonTuple> exc_info = engine.Operations.GetMember<Func<PythonTuple>>(engine.GetSysModule(), "exc_info");
保存某处有用的,然后当你需要调用它:
TraceBack tb = (TraceBack)exc_info()[2];
为你捕捉异常那将只要工作。
一个略少的支持,但更简单的方法来做到这一点是:
TraceBack tb = PythonOps.GetExceptionInfoLocal(context, exception)[2];
但你需要一个CodeContext做到这一点。在2.0中,你可以得到一个CodeContext:
new CodeContext(new PythonDictionary(), HostingHelpers.GetLanguageContext(engine));
不隶属于 StackOverflow