【发布时间】:2015-08-24 00:58:16
【问题描述】:
应在不停止调试器的情况下执行以下代码:
var engine = Python.CreateEngine(AppDomain.CurrentDomain);
var source = engine.CreateScriptSourceFromString("Foo.Do()");
var compiledCode = source.Compile(new PythonCompilerOptions { Optimized = true });
try
{
compiledCode.Execute(
engine.CreateScope(
new Dictionary<string, object> {
{ "Foo", new Foo() }
}));
MessageBox.Show("Executed without error");
}
catch (Exception ex)
{
MessageBox.Show(string.Format("Error at execution: {0}", ex.Message));
}
使用这个类:
public class Foo
{
public void Do()
{
throw new InvalidOperationException("The debugger should not break here...");
}
}
脚本执行在 try 块中运行以处理任何异常。
如果我有像1 / 0 这样的代码,所有的作品都很好。异常是在 Python(或引擎)中创建的,并且我的 catch 块按预期调用,而不会强制调试器在任何地方停止。
在 C# 中调用 try { new Foo().Do(); } catch {} 也可以在不停止调试器的情况下工作。
但是在 python 中调用的 C# 代码中抛出异常将强制调试器在 throw new...-line 处停止。
我不希望调试器停在那里。
我在 Debug/Exceptions 中禁用了第一次机会异常,但调试器仍然在 throw 处停止。
我不能使用DebuggerStepThrough,因为在我的工作代码中,它没有在此方法中抛出异常,而是在代码中更深层次。该代码也用于 C# 之外,并且使用 DebuggerStepThrough 装饰所有这些方法将使我的 C# 调试器过时。
一种解决方案是也禁用Debug/Exceptions 中的User-unhandled 异常,但我想中断用户未处理的异常,因此这不是一个选项。
如何禁用在 try...catch 块中执行的 python 代码调用的第一次机会异常?
【问题讨论】:
-
Python代码中是否包含try/catch?大概它没有,现在它确实是一个判断调用,应该位于调试器中断的“最佳”位置。可以预见的是,这不会出现在 Python 代码不再可运行并且异常的实际来源不再可见的地方。您必须删除该 C# 代码的 PDB 文件才能使调试器相信它不是“我的代码”。
-
你看到了吗?不,它只包含
Foo.Do()。我无法删除 PDB,因为还有很多其他代码需要正常调试。 -
我没有看到,你没有发布你的 Python 代码。对它刻薄有什么意义吗?
-
请看我贴出的 C# 代码:
engine.CreateScriptSourceFromString("Foo.Do()");这里是...没有隐藏代码...
标签: c# exception ironpython first-chance-exception