在嵌入式IronPython中导入库时抛出未处理的GeneratorExitException

时间:2009-09-09 11:51:48

标签: .net ironpython

我将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调试器时发生。

2 个答案:

答案 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()。)