2

假设我在 C++ 程序中,我想将这些报告转换为异常。使用 C++ throw 语句是一种合理的方法,还是我只是重定向到 stderr?

4

1 回答 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 回答