Получение информации обратной трассировки из исключений IronPython

StackOverflow https://stackoverflow.com/questions/1465262

  •  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 )

То, что я хотел бы получить вместо этого, - это обратная трассировка python.Есть ли какой-либо способ получить эту информацию?

Это было полезно?

Решение

Если вам просто нужна текстовая версия, вы можете сделать:

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

Если вам действительно нужен объект Python track back, я бы предложил:

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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top