假设我在C ++程序中,我想将这些报告转换为异常。使用C ++ throw语句是一种合理的方法,或者我只是被重定向到stderr?
答案 0 :(得分:2)
不,你不能从钩子中抛出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);
}