Exception 在C语言中捕获Ironpython异常#

Exception 在C语言中捕获Ironpython异常#,exception,ironpython,Exception,Ironpython,我正在C#中嵌入IronPython 2.0。在IronPython中,我定义了自己的异常: def foobarException(异常): 通过 并在某处提出: raisefoobarexception(“这是异常消息”) 现在在C#,我有: 试试看 { callIronPython(); } 捕获(例外e) { //如何确定异常的名称(FooberException) //是从IronPython抛出的吗? //通过e.Message,我得到“这是异常消息” } 假设您使用与.NET等

我正在C#中嵌入IronPython 2.0。在IronPython中,我定义了自己的异常:

def foobarException(异常):
通过
并在某处提出:

raisefoobarexception(“这是异常消息”)
现在在C#,我有:

试试看
{
callIronPython();
}
捕获(例外e)
{
//如何确定异常的名称(FooberException)
//是从IronPython抛出的吗?
//通过e.Message,我得到“这是异常消息”
}

假设您使用与.NET等效的编译器编译python代码,您将拥有一个静态类型,这只是一个例外。如果此异常是公共的(导出类型),那么您将引用项目中包含python代码的程序集,并在某个python命名空间中挖掘类型FooberException。这样,C#将能够键入与该异常匹配的内容。这是唯一正确的方法。

IronPython将.NET异常映射到Python异常的方法并不总是简单的;许多异常报告为
SystemError
(尽管如果导入.NET异常类型,可以在
except
子句中指定)。您可以使用

类型(e)。\uu名称__
如果需要.NET异常类型,请确保模块中有
import clr
。它使.NET属性在对象上可用,例如字符串上的
ToUpper()
方法。然后,您可以使用
.clsException
属性访问.NET异常:

导入clr
尝试:
1/0
除例外情况外,e:
打印类型(e)。\u\u名称__
打印类型(例如clsException)。\uuu名称__
印刷品:

ZeroDivisionError#python异常
DivideByZeroException#对应的.NET异常
捕获所需的特定.NET异常的示例:

从系统导入除以零异常
尝试:
1/0
除除以零例外:
打印“捕获”

从C#捕获IronPython异常时,可以使用Python引擎格式化回溯:

catch(异常e)
{
例外操作eo=_engine.GetService();
字符串错误=eo.FormatException(e);
控制台写入线(错误);
}
您可以从回溯中提取异常名称。否则,您将不得不调用IronPython宿主API来直接从异常实例检索信息<代码>引擎。操作为此类交互提供了有用的方法。

我的最终解决方案是:

我在C#中有一个结果类,它被传递给我的ironpython代码。在Ironpython中,我用所有计算值填充结果类。我刚刚向这个类添加了一个成员变量IronPythonExceptionName。现在我在IronPython中进行了一次简单的尝试:

try: 
    complicatedIronPythonFunction()
except Exception, inst:
    result.IronPythonExceptionName = inst.__class__.__name__
    raise inst

你用调试器试过了吗?您应该会看到异常类型或内部异常,或者实际python异常存储的位置。是的,我尝试使用调试器,但找不到它。问题是它与IronPython 1.1一起工作。当我正确地记得在e.Data[“pythonexeptioninfo”]中实际上有python exception.message。在e.Message中有异常的名称。FormatException仅对SyntaxErrorException有用,它只是对任何其他异常返回Exception.Message。