我有一个在visual studio下运行良好的应用程序。
但是,当我独立运行它时,不会处理抛出异常的某个操作。 (预期异常,但在VS下正确处理。)
我在machine.config中添加了一行以启用JIT调试,尝试找到问题,但我无法重新创建错误(异常处理正确)。删除该行会导致错误返回。
我该如何开始寻找原因?
我的代码的相关部分(我相信)(已编辑以删除无关的详细信息)位于http://pastebin.com/i2zLCTn5。
答案 0 :(得分:0)
可能会影响代码在Visual Studio的不同环境中的行为方式的一些建议:
关闭"托管流程" ... http://msdn.microsoft.com/en-us/library/ms185330(v=vs.80).aspx
运行程序,然后"附加到流程" (然后它不会进入托管过程,模块将被加载并进行JIT优化)。
在“例外”对话框中,勾选“#Th; Thrown"正在处理/处理的异常的复选框....这样您就可以找到处理它的人以及原因。如果在那里处理异常,您将需要安装.NET Framework源代码,以便您可以看到详细信息。
你可以尝试在WinDBG下运行它(它可能表现不同,因为你赢了并且在托管进程下运行,即.vshost)....确保你有扩展名DLL PSSCOR4(如果使用.NET 4),以便您可以理解事物。
答案 1 :(得分:0)
所以,我发现 - 或者更确切地说,一位朋友解释了 - 这个问题的原因:
禁用JIT调试时,即使执行似乎正确流动,也无法捕获跨线程的异常。
异常被抛出在Form.Closing事件处理程序中:
form.Closing += new delegate
{
switch(form.DialogResult)
{
case DialogResult.OK:
// do stuff;
break;
case DialogResult.Cancel:
throw new AbortOperationException();
}
}
// ...
try
{
mainForm.Invoke(new Function<Form, DialogResult>(form.ShowDialog), mainWindow);
}
catch (AbortOperationException)
{
// handle abort
}
解决方案是稍微重构以消除throw
:
form.Closing += new delegate
{
if (form.DialogResult == DialogResult.OK)
{
// do stuff
}
}
// ...
var result = (DialogResult)mainForm.Invoke(new Function<Form, DialogResult>
if (result == DialogResult.Cancel)
{
// handle abort
}