我可以从_CrtSetReportHook中抛出异常吗?

时间:2011-08-05 21:16:23

标签: debugging visual-c++ msvcrt

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

1 个答案:

答案 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);
}