我正在尝试为函数的开头和结尾编写两个简单的宏,以便管理和记录程序中的所有异常.换句话说,我想在我的所有功能中都有一个try-catch块.
在简单的情况下,请考虑以下宏.
#define __BEGIN_FUNCTION__ try {
#define __END_FUNCTION__ } catch(std::exception e) \
{ log << time << ':' << e << endl; }
Run Code Online (Sandbox Code Playgroud)
但如果我将这两个宏放在函数的开头和结尾,编译器将给出"并非所有控制路径返回值"错误.
任何解决方案
jal*_*alf 14
这是处理异常的可怕方式.如果抛出异常,则是因为发生了错误.然后,您必须处理错误,解决发生的问题,或允许它终止程序.
忽略异常毫无意义.
至少,您应该在记录异常后重新抛出异常.更改END_FUNCTION宏以包含a throw;.这也应该解决你得到的编译器错误.
最后一点:您的宏名称选择非常糟糕.命名为:
保留供实现(编译器和标准库)使用.
您可以使用程序中任何位置的名称来冒险冲突.
您还应该注意,捕获异常应该通过引用来完成(catch (const std::exception& e)并且它不会捕获不是从中派生的异常std::exception.如果您想捕获抛出的所有内容,请使用catch(...).
我知道你不想听,但答案是只在适当时包含try/catch块.你在这里尝试做的事情基本上是真的,非常懒惰,提供几乎没有任何好处的方式.更糟糕的是,因为你把所有东西都当作一般的例外,并且不应该像处理它们那样处理你的例外情况.
答案是"不要这样做".