2
假设我在C++程序中,我想将这些报告转换为异常。使用C++ throw语句是否合理,或者我坚持重定向到stderr?我可以从_CrtSetReportHook抛出异常吗?
假设我在C++程序中,我想将这些报告转换为异常。使用C++ throw语句是否合理,或者我坚持重定向到stderr?我可以从_CrtSetReportHook抛出异常吗?
不,你不能从你的钩子抛出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);
}
谁应该抓住它?它通常会在main()返回后调用。这是一个调试功能,你运行在一个良好控制的环境中。 –
我主要想到像ASSERT [E]这样的调用,它们很少在main()之外。 –
这不是一个投掷。可以有很多*,很快变老。默认处理程序有什么问题? –