我正在将异常添加到现有代码库中。在此示例中,该函数会增加一些内存并调用引发异常DoAction()
的子函数。ExceptionFnk()
该DoAction()
函数需要在将异常传递给更高级别以正确处理之前清理创建的内存。
考虑以下代码
#include "stdafx.h"
#include <exception>
#include <string>
class CFooBase {
public:
static unsigned int _id ;
CFooBase( ) { printf( "Created CFooBase (%d)\n", ++CFooBase::_id ); }
~CFooBase( ) { printf( "Destroy CFooBase (%d)\n", CFooBase::_id-- ); }
};
unsigned int CFooBase::_id ;
class ExceptionBar: public std::exception
{
public:
const char* what() const throw() { return std::string( "ExceptionBar").c_str() ; }
int Get() { return 99; }
};
// this function just throws an exception.
void ExceptionFnk() {
throw ExceptionBar( );
}
void DoAction() {
CFooBase * b = new CFooBase();
ExceptionFnk();
delete b;
}
int _tmain(int argc, _TCHAR* argv[])
{
try {
DoAction() ;
}
catch( ExceptionBar& e ) {
printf( "Higher, Exception: %s, magic number %d\n", e.what(), e.Get() ) ;
} catch (...) {
printf( "Catch all, should not happen.\n" ) ;
}
return 0;
}
产生这个输出:
Created CFooBase (1)
Higher, Exception: ExceptionBar, Magic number 99
如果可能,我会尽量不使用智能指针,因为它会使系统过于复杂。
我的问题是:
DoAction()
在不使用智能指针的情况下,如何在将异常传递给更高级别之前清理内存。?