从IronPython异常获取回溯信息 [英] Getting traceback information from IronPython exceptions

查看:100
本文介绍了从IronPython异常获取回溯信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将IronPython托管在应用程序中,每当我捕获到从脚本引发的异常时,都会得到无用的乱码,如下所示:

I have IronPython hosted within my application, whenever I catch an exception thrown from a script, I get unhelpful gibberish like this:

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 )

我想获取的是python追溯。

What I would like to get instead is the python traceback. Is there anyway to get this information?

推荐答案

如果只需要文本版本,可以这样做:

If you just need a text version you can do:

engine.GetService<ExceptionOperations>().FormatException(exception);

如果您确实需要Python跟踪对象,我建议:

If you really need the Python track back object I would suggest:

Func<PythonTuple> exc_info = engine.Operations.GetMember<Func<PythonTuple>>(engine.GetSysModule(), "exc_info");

将其保存在有用的地方,然后在需要调用它时:

Save that somewhere useful and then when you need to invoke it:

TraceBack tb = (TraceBack)exc_info()[2];

只要您捕获到异常,该方法就会起作用。

That'll work as long as you're catching the exception.

一个稍微受支持但更简单的方法是:

A slightly less supported but easier way to do this would be:

TraceBack tb = PythonOps.GetExceptionInfoLocal(context, exception)[2];

但是您需要使用CodeContext来执行此操作。在2.0中,您可以通过以下方式获取CodeContext:

But you need a CodeContext to do this. In 2.0 you can get a CodeContext by:

new CodeContext(new PythonDictionary(), HostingHelpers.GetLanguageContext(engine));

这篇关于从IronPython异常获取回溯信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆