Col*_*Ear 6 c# exception linq-to-sql
我有一个看起来像这样的函数:
try
{
_dbManager.InsertSearch(some data);
}
catch (Exception ex)
{
//do logging
}
Run Code Online (Sandbox Code Playgroud)
_dbManager使用LINQ将数据插入SQL数据库.昨天,托管数据库的机器耗尽了硬盘空间,我的程序崩溃了.我有一个崩溃转储,它显示有SqlClient.SqlException一个异常消息,例如"数据库事务日志已满......".
我的问题是:为什么异常没有在上面的catch块中被捕获?奇怪的是,当我试图重现这个问题时,我可以得到相同的异常,但是它被catch块捕获了.可能是什么问题?
第二,相关问题:想象一下,如果我们使用第三方库,我们不希望抛出任何异常.我们可以使用try-catch块,但这只适用于调用线程.如果第三方启动新线程并抛出异常怎么办?有办法处理这个吗?我知道我可以注册我们的UnhandledExceptionHandler,但这似乎与我想要的不同.
我的问题是:为什么异常没有在上面的catch块中被捕获?
正如David Stratton所说,系统可能已经没有磁盘空间而无法写入日志文件.由于损坏的状态异常而导致进程终止的可能性将无法传递到.NET 4中的catch-all块.终止进程的异常也可能从没有捕获的线程中抛出 -所有.
第二,相关问题:想象一下,如果我们使用第三方库,我们不希望抛出任何异常.
我认为你必须在那里停下来重新思考它.你说的是你完全100%确定在第三方库中什么都不会出错.有一些例外(比如OutOfMemoryException)您不应该捕获,因为您的代码根本不知道如何从中恢复.具有异常处理的经验法则是,您应该只捕获您完全理解并知道如何从中恢复的异常.请看一下这个答案及其中的链接.
如果第三方启动新线程并抛出异常怎么办?有办法处理这个吗?
处理此问题的最佳方法是依赖将终止您的应用程序的默认CLR策略.您可以做的唯一合理的事情是尝试通过订阅AppDomain.UnhandledException来记录它.
| 归档时间: |
|
| 查看次数: |
1405 次 |
| 最近记录: |