我有一个有趣的问题,在应用程序关闭期间,try / catch块似乎在堆栈中被忽略。
我没有工作测试项目(但是由于截止日期,否则我会完全尝试重新编写),但请考虑以下代码段。
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch(IndexNotFoundException e)
{
if(doThrow)
throw;
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
throw new IndexNotFoundException ();
}
public static string RunAndIgnoreThrow(int index)
{
try
{
return Run(index);
}
catch(IndexNotFoundException e)
{
}
return "";
}
在运行期间,此模式非常有用。我们得到了对依赖程序控制异常(坏)的代码的遗留支持,我们可以继续前进并慢慢删除用于程序控制的异常。
然而,当关闭我们的UI时,我们看到从“运行”抛出的异常,即使“doThrow”对于“RunAndPossiblyThrow”的所有当前使用都是假的。我甚至通过修改代码看起来像“RunAndIgnoreThrow”来验证这一点,我仍然会在UI关闭后崩溃。
先生。 Eric Lippert,我每天都在阅读你的博客,我很乐意听到它是一些已知的bug,我不会发疯。
EDIT 这是多线程的,我已经验证所有对象在被访问时都没有被修改
EDIT 明确显示异常是我们的
EDIT 忘了提,这是关闭,不幸的是视觉工作室无法直接赶上崩溃。它可能会崩溃在UI线程以外的线程上,一旦主要关闭,它就会关闭。我只能通过反复运行&关闭应用程序,打开任务管理器,“创建转储文件”,然后查看Windbg中产生的400 + mb混乱。 Win7 64供参考。确保这对你有意义。
修改
关闭时的以下代码仍显示相同的异常。
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch
{
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
throw new IndexNotFoundException ();
}
唯一似乎摆脱异常的是直接进入
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
return Run(index);
}
catch
{
}
return "";
}
public static string Run(int index)
{
if(_store.Contains(index))
return _store[index];
return "";
}
当然,例外情况已经消失,但我对疯狂的恐惧仍然存在。
修改
它变得更糟......这仍然会崩溃......
class IndexNotFoundException : Exception { }
public static string RunAndPossiblyThrow(int index, bool doThrow)
{
try
{
throw new IndexNotFoundException();
}
catch
{
}
return "";
}
EDIT 我有一种明显的感觉,这会让我无处可去。除了奇怪的行为之外,我还可以注意到在上述情况下执行UI期间,try catch正在忠实执行。我的用户界面没有崩溃&它充满了空字符串。但是,一旦我开始关闭UI,崩溃就会显示出来并且try catch不再阻止异常。
编辑&最后 显然,转储文件在其中列出了最新的第一次机会异常。我通过创建一个新的项目来验证这一点,该项目在try catch&睡了10秒钟。在等待期间,我得到了.dmp文件&果然,我完全被抓住的异常出现了。
我会为有用的答案标记一些要点,但不幸的是,我的代码崩溃仍然没有押韵或原因......
答案 0 :(得分:4)
添加一个Exception作为额外的catch。我认为你得到了一些除ApplicationException之外的其他异常,那就是崩溃你的应用程序。
答案 1 :(得分:3)
有各种例外情况无法捕获。特别是Stack Overflow!其中一个可能出现在你的代码中吗?
请参阅http://www.bluebytesoftware.com/blog/PermaLink,guid,223970c3-e1cc-4b09-9d61-99e8c5fae470.aspx
答案 2 :(得分:0)
您是否尝试过添加“finally”子句?只是为了看看它是否会完全忽略try / catch?理论上,无论如何,它都应该在它退出try / catch之前跳转到该行。
如果它仍然忽略了它,那么肯定会有一些奇怪的东西。
答案 3 :(得分:0)
可能你会抓住并再次从Run中抛出一些其他异常。可能_store是null或者什么。
答案 4 :(得分:0)
可能有助于诊断的一些事项:
注册AppDomain.CurrentDomain.UnhandledException,以便查看某些内容是否在UI线程以外的线程上崩溃
注册Application.ThreadException以捕获未在UI线程中捕获的任何异常
由于这是在关机期间发生的,您是否正在使用可能会在终结器线程上投掷的任何终结器?