未捕获.NET异常

时间:2011-09-24 16:20:03

标签: c# linq-to-sql exception

我有一个看起来像这样的函数:

try
{
     _dbManager.InsertSearch(some data);
}
catch (Exception ex)
{
    //do logging
}

_dbManager使用LINQ将数据插入SQL数据库。昨天,托管数据库的机器耗尽了硬盘空间,我的程序崩溃了。我有一个崩溃转储,显示有一个SqlClient.SqlException引发了一条异常消息,读取类似“数据库事务日志已满......”。

我的问题是:为什么异常没有在上面的catch块中被捕获?奇怪的是,当我试图重现这个问题时,我可以得到相同的异常,但是它被catch块捕获了。可能是什么问题?

其次,相关问题:想象一下,如果我们使用第三方库,我们不希望抛出任何异常。我们可以使用try-catch块,但这只适用于调用线程。如果第三方启动新线程并抛出异常怎么办?有办法处理这个吗?我知道我可以注册我们的UnhandledExceptionHandler,但这似乎与我想要的不同。

3 个答案:

答案 0 :(得分:6)

  

我的问题是:为什么异常没有在上面的catch块中被捕获?

David Stratton所示,系统可能已经没有磁盘空间而无法写入日志文件。由于Corrupted State Exception将导致进程终止,因此无法将其传递给.NET 4中的catch-all块。终止进程的异常也可能是从没有进程的线程中抛出的全捕获

  

第二,相关问题:想象一下,如果我们使用第三方库和   我们不希望抛出any异常。

我认为你必须在那里停下来重新思考它。你说的是你完全100%确定在第三方库中什么都不会出错。有一些例外(例如OutOfMemoryException)你不应该被捕获,因为你的代码根本不知道如何从中恢复。具有异常处理的经验法则是,您应仅捕获您完全理解并知道如何从恢复的异常。请查看此answer及其中的链接。

  

如果第三方启动新线程并抛出异常,该怎么办?   那里?有办法处理这个吗?

处理此问题的最佳方法是依赖将终止您的应用程序的默认CLR策略。您可以做的唯一合理的事情是尝试通过订阅AppDomain.UnhandledException来记录它。

答案 1 :(得分:0)

是否可能在try/catch方法中有另一个InsertSearch块,该方法具有条件throw语句。

'DBManager'类的实现者,如果没有足够的空间写入磁盘,则不选择throw。只是一个想法。

答案 2 :(得分:0)

如果您使用代码合同运行时检查,我建议您检查DLL的编译版本。 阅读本文了解详情Why .net exception is not caught?