gpt4 book ai didi

c# - 未捕获 .NET 异常

转载 作者:太空狗 更新时间:2023-10-29 21:35:57 25 4
gpt4 key购买 nike

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

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

_dbManager 使用 LINQ 将数据插入 SQL 数据库。昨天,托管数据库的机器硬盘空间不足,我的程序崩溃了。我得到了一个故障转储,它显示有一个 SqlClient.SqlException 引发了异常消息,内容类似于“数据库事务日志已满...”。

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

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

最佳答案

My question is: Why didn't the exception get caught in the catch block above?

作为David Stratton提示,系统可能磁盘空间不足,无法写入日志文件。进程也有可能因 Corrupted State Exception 而终止。在 .NET 4 中不会传递给您的 catch-all block 。终止进程的异常也可能从没有 catch-all 的线程中抛出。

Second, related question: Imagine if we use a third party library and we don't want any exception thrown.

我认为您必须就此停下来重新考虑一下。您所说的是您绝对 100% 确定第三方库中不会出错。有一些异常(例如 OutOfMemoryException)您不应捕获,因为您的代码根本不知道如何从中恢复。异常处理的经验法则是您应该只捕获您完全理解并知道如何从中恢复的异常。请看这个answer以及其中的链接。

What if the third party starts new thread and an exception is thrown there? Is there a way to handle this?

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

关于c# - 未捕获 .NET 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com