Ironpython 如果在作用域中执行,则会丢失堆栈帧



如果我执行以下代码:

    var engine = Python.CreateEngine();
    ScriptScope sc = engine.CreateScope ();
    var ss = engine.CreateScriptSourceFromString ("ndef f():n    raise Exception('hello generator')n    yield 42nndef g():n    f().next()nng()n", "a.py");
    try {
        ss.Execute();
    } catch(Exception e) {
        UnityEngine.Debug.Log(engine.GetService<ExceptionOperations>().FormatException(e));
    }

我得到堆栈跟踪:

Traceback (most recent call last):
  File "a.py", line 7, in g
  File "a.py", line 3, in f
Exception: hello generator

但是当我在范围内执行它时:

    var engine = Python.CreateEngine();
    ScriptScope sc = engine.CreateScope ();
    var ss = engine.CreateScriptSourceFromString ("ndef f():n    raise Exception('hello generator')n    yield 42nndef g():n    f().next()nng()n", "a.py");
    try {
        ss.Execute(sc);
    } catch(Exception e) {
        UnityEngine.Debug.Log(engine.GetService<ExceptionOperations>().FormatException(e));
    }

我收到缺少堆栈跟踪信息的回溯...

Traceback (most recent call last):
Exception: hello generator

为什么?我怎样才能让它工作?

编辑:测试后,似乎问题只存在于Unity中...

显然,整个异常处理被Unity,Mono 2和IronPython 2.6.2破坏了。我在这里发帖,以防有人正在寻找对我有用的工作解决方案:

        List<DynamicStackFrame> frames = ExceptionHelpers.AssociateDynamicStackFrames (e);
        if (frames == null)
            frames = new List<DynamicStackFrame> ();
        String text = "Traceback (most recent call first):n";
        foreach (DynamicStackFrame frame in frames) {
            text += " File "" + frame.GetFileName () + "", line " + frame.GetFileLineNumber () + ", in " + frame.GetMethodName () + "n";
        }
        text += "Exception: " + e.Message;
        Debug.Log (text);
        frames.Clear ();
        ExceptionHelpers.ClearDynamicStackFrames (e);

相关内容

最新更新