gpt4 book ai didi

c++ - 如何统一处理所有错误,包括内部 C 库错误

转载 作者:太空狗 更新时间:2023-10-29 19:45:01 24 4
gpt4 key购买 nike

我想在不终止程序的情况下优雅地处理所有内部错误。

讨论 here ,使用 _set_se_translator 捕获被零除错误。

但它没有捕捉到,例如,C 运行时库错误 -1073740777 (0xc0000417),这可能是由带有百分号的 printf 格式字符串引起的他们不应该在哪里。 (这只是一个例子;当然我们应该检查这样的字符串)。要处理这些,需要_set_invalid_parameter_handler

列出了大约十个其他此类处理程序 here .

此外,这个会捕获未捕获的 C++ 异常:SetUnhandledExceptionFilter .因此,它可以与 __set__ ... 函数一起使用。 (MSVC 2008 中关于 using it 的文章。)

我想捕获所有错误以便处理它们(通过记录、抛出现代 C++ 标准异常并返回特定于应用程序的错误代码)。是否有一个处理程序可以捕获所有内容?

另见 StackOverflow .

我正在使用 Visual Studio 2008。

最佳答案

我会警告不要这样做。

内部错误不可恢复。如果您除以零或其他任何东西 - 该程序是不可恢复的。

如果您将终止处理程序变成使程序继续运行的东西,您无法保证程序的STATE,您可能会崩溃和损坏以后以不同的方式。例如,假设程序在您转移的终止时持有一些或其他资源!

让我们举个讨厌的例子:

void log(const char* fmt,...) {
lock(logfile);
va_args...
fvprintf(logfile,fmt,__... <--- this line calls the terminator
unlock(logfile);
}

如果不终止程序会发生什么?下次有人尝试记录某些内容时,程序会发生什么情况?

我怎么强调都不为过——你应该使用 Hook 终止方法来进行额外的日志记录等,而不是别的。之后您应该始终继续退出。


有一类完全不同的错误可以被拦截:

许多 API 使用返回码来指示错误情况与调用方通信。使用宏或辅助函数来检查这些返回代码并将它们转换为异常是合适的。这是因为该选择在您可以看到的代码中。

如果您覆盖 _set_errno 处理程序或其他东西,您将导致您没有编写的代码期望 setter 正常返回而不是返回,并且它可能没有完成清理。

关于c++ - 如何统一处理所有错误,包括内部 C 库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155442/

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