在我最近写的一个程序中,我希望在我的"业务逻辑"代码在第三方或项目API中触发异常时进行记录.(为了澄清,我想在使用API导致异常时进行记录.这可能比实际高出许多帧throw,并且可能比实际低很多帧catch(可以发生异常有效负载的记录).)我做了以下:
void former_function()
{
/* some code here */
try
{
/* some specific code that I know may throw, and want to log about */
}
catch( ... )
{
log( "an exception occurred when doing something with some other data" );
throw;
}
/* some code here */
}
Run Code Online (Sandbox Code Playgroud)
简而言之,如果发生异常,请创建一个catch-all子句,记录错误并重新抛出.在我看来,这是安全的.我知道一般来说,catch-all被认为是错误的,因为根本没有对异常的引用来获取任何有用的信息.但是,我只是要重新抛出它,所以什么都不会丢失.
现在,它本身很好,但其他一些程序员修改了这个程序,最终违反了上述规定.具体来说,他们在一个案例中将大量代码放入try-block,在另一个案例中删除了'throw'并放置了'return'.
我现在看到我的解决方案很脆弱; 这不是未来修改的证据.
我想要一个没有这些问题的更好的解决方案.
我有另一个没有上述问题的潜在解决方案,但我想知道别人怎么想.它使用RAII,特别是一个"Scoped Exit"对象,如果在构造时std::uncaught_exception 不是真的则隐式触发,但在破坏时是真的:
#include <ciso646> // not, and
#include <exception> // uncaught_exception
class ExceptionTriggeredLog
{
private: …Run Code Online (Sandbox Code Playgroud)