我将IronPython嵌入到C#应用程序中。我让用户编写IronPython脚本,他们可以在其中导入IronPython附带的一组标准库。在这些脚本中,当用户导入“随机”库或“filecmp”库时,将抛出未处理的GeneratorExitException。
其他库如math,re,string和os可由用户导入,没有任何问题。
这是我得到的堆栈跟踪:
IronPython.dll!IronPython.Runtime.PythonGenerator.ThrowThrowable() + 0x85 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.CheckThrowable() + 0x27 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.CheckThrowableAndReturnSendValue() + 0x3c bytes
IronPython.dll!IronPython.Runtime.Operations.PythonOps.GeneratorCheckThrowableAndReturnSendValue(object self = {IronPython.Runtime.PythonGenerator}) + 0x49 bytes
Snippets.debug.scripting!S$12.lambda_method$344(ref int state = -1, ref object current = null) + 0x124 bytes Unknown
Microsoft.Scripting.dll!Microsoft.Scripting.Runtime.GeneratorEnumerator<object>.System.Collections.IEnumerator.MoveNext() + 0x3c bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.MoveNextWorker() + 0xa3 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.System.Collections.IEnumerator.MoveNext() + 0x42 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.throw(object type = {"Exception of type 'IronPython.Runtime.Exceptions.GeneratorExitException' was thrown."}, object value = null, object traceback = null) + 0xb5 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.throw(object type = {"Exception of type 'IronPython.Runtime.Exceptions.GeneratorExitException' was thrown."}) + 0x2a bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.close() + 0x56 bytes
IronPython.dll!IronPython.Runtime.PythonGenerator.Finalize() + 0x42 bytes
有没有人遇到过类似的问题?什么是解决方案?
修改 这仅在附加Visual Studio调试器时发生。
答案 0 :(得分:1)
这真的是一个未处理的异常,或者你只是在调试器中看到它?
在IronPython 2.0和2.6中,生成器的终结器(这是在这里运行的 - 参见Finalize方法)有一个try / catch(异常),它吞下所有异常。因此,虽然可能会在终结器线程上抛出异常,但它应该对您的应用程序没有任何影响。
抛出异常的原因是有人在完成之前没有迭代生成器。 CPython文档说,当收集生成器时,它会向生成器发送一个异常,以便让任何finally块运行。
答案 1 :(得分:0)
不是真的答案(我这里没有IronPython的访问权限),但如果您尝试运行此脚本:
import traceback
try:
import random
except:
traceback.print_exc()
...它将显示Python级别的回溯而不是C#回溯 - 这可能会使发生的事情更加清晰。
(如果sys.stdout没有连接到您正在捕获的任何内容,则可以改为使用traceback.format_exc()
。)