在c++中,为了便于定位问题,进程异常退出时,需要获取返回码和错误信息。stout中将这种功能巧妙的封装成EXIT类。
#define EXIT(status) __Exit(status).stream() struct __Exit { __Exit(int _status) : status(_status) {} NORETURN ~__Exit() { std::cerr << out.str() << std::endl; exit(status); } std::ostream& stream() { return out; } std::ostringstream out; const int status; };
__EXIT类以返回码作为构造函数参数,在析构时,先将错误信息输出到cerr中,再执行exit(status)。这是RAII的一次巧妙实践。
用户只需要执行
EXIT(1) << "something failed";
就可以1退出,同时输出"something failed"。