假设我在 C++ 程序中,我想将这些报告转换为异常。使用 C++ throw 语句是一种合理的方法,还是我只是重定向到 stderr?
问问题
1473 次
1 回答
4
不,你不能从你的钩子中抛出 C++ 异常。
它可能在某些时候起作用 - 但一般来说 - 当调用钩子时,CRT 处于不确定状态并且可能不再能够抛出或处理异常。当 CRT 出现问题时抛出异常与从对象的析构函数中抛出异常类似,该对象在堆栈展开期间由于异常而被调用。此外,CRT 的深处不是引发 C++ 异常的合适位置,这样做可能会使运行时处于不良状态——如果还没有的话!
你应该做的是:
int no_dialog_box_but_act_as_if_it_had_appeared_and_abort_was_clicked (int /* nRptType */,
char *szMsg,
int * /* retVal */)
{
fprintf (stderr, "CRT: %s\n", szMsg);
/* raise abort signal */
raise (SIGABRT);
/* We usually won't get here, but it's possible that
SIGABRT was ignored. So exit the program anyway. */
_exit (3);
}
于 2015-03-04T11:02:14.313 回答