C++函数宏的开始和结束

MBZ*_*MBZ 0 c++ macros

我正在尝试为函数的开头和结尾编写两个简单的宏,以便管理和记录程序中的所有异常.换句话说,我想在我的所有功能中都有一个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(...).


Jef*_*ter 5

为什么不让异常泡到顶部并在一个地方处理呢?

如果你可以做一些事情,只捕捉异常.


Eri*_*sma 5

我知道你不想听,但答案是只在适当时包含try/catch块.你在这里尝试做的事情基本上是真的,非常懒惰,提供几乎没有任何好处的方式.更糟糕的是,因为你把所有东西都当作一般的例外,并且不应该像处理它们那样处理你的例外情况.

答案是"不要这样做".