2011-08-05 76 views
2

假设我在C++程序中,我想将这些报告转换为异常。使用C++ throw语句是否合理,或者我坚持重定向到stderr?我可以从_CrtSetReportHook抛出异常吗?

+0

谁应该抓住它?它通常会在main()返回后调用。这是一个调试功能,你运行在一个良好控制的环境中。 –

+0

我主要想到像ASSERT [E]这样的调用,它们很少在main()之外。 –

+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); 
} 
相关问题