Debugging 我可以从_CrtSetReportHook引发异常吗? 假设我在C++程序中,我想把这些报告转换成异常。是否使用C++抛出语句是一种合理的方法来执行它,或者我只是被重定向到STDRR? < P>不,不能从钩子中抛出C++异常。

Debugging 我可以从_CrtSetReportHook引发异常吗? 假设我在C++程序中,我想把这些报告转换成异常。是否使用C++抛出语句是一种合理的方法来执行它,或者我只是被重定向到STDRR? < P>不,不能从钩子中抛出C++异常。,debugging,visual-c++,msvcrt,Debugging,Visual C++,Msvcrt,当调用钩子时,CRT处于不确定状态,可能不再能够抛出或处理异常,但通常情况下,它可能会在某些时候工作。当CRT出现问题时引发异常,与从对象的析构函数引发异常类似,该析构函数在堆栈展开期间因异常而被调用。此外,CRT的深度不是抛出C++异常的适当位置,这样做可能会使运行时间处于不好的状态——如果还没有的话!p> 您应该做以下几点: int no_dialog_box_but_act_as_if_it_had_appeared_and_abort_was_clicked (int /* nRptTy

当调用钩子时,CRT处于不确定状态,可能不再能够抛出或处理异常,但通常情况下,它可能会在某些时候工作。当CRT出现问题时引发异常,与从对象的析构函数引发异常类似,该析构函数在堆栈展开期间因异常而被调用。此外,CRT的深度不是抛出C++异常的适当位置,这样做可能会使运行时间处于不好的状态——如果还没有的话!p> 您应该做以下几点:

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

谁应该抓住它?它通常在main()返回后调用。这是一个调试函数,您正在一个控制良好的环境中运行。我主要考虑像ASSERT[E]这样的调用,它们很少在main()之外。这不是一个抛出。它们可能很多,很快就会变老。默认处理程序有什么问题?@Hans Passant:在这种情况下,我正在运行单元测试。当我得到一个调试断言时,我希望它像对待任何其他错误一样,即异常。我不希望Windows应用程序出现自定义的中止/重试/忽略对话框,控制台应用程序出现自定义的stderr消息。