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

时间:2010-08-07 18:01:36

标签: c++ macros

我正在尝试为函数的开头和结尾编写两个简单的宏,以便管理和记录我程序中的所有异常。换句话说,我想在我的所有功能中都有一个try-catch块。

在简单的情况下考虑以下宏。

#define __BEGIN_FUNCTION__ try {
#define __END_FUNCTION__ } catch(std::exception e) \
{ log << time << ':' << e << endl; }

但如果我将这两个宏放在函数的开头和结尾,编译器将给出“并非所有控制路径返回值”错误。

任何解决方案?

3 个答案:

答案 0 :(得分:14)

处理异常是一种可怕的方法。如果抛出异常,则是因为发生了错误。然后,您必须处理错误,解决发生的问题,或允许它终止程序。

忽略这个例外毫无意义。

至少,您应该在记录异常后重新抛出异常。更改END_FUNCTION宏以包含throw;。这也应该解决你得到的编译器错误。

最后一点:您的宏名称选择非常糟糕。 命名为:

  • 包含双下划线或
  • 以下划线开头,后跟大写字母

保留供实现使用(编译器和标准库。

您可以在程序中使用任何地方这样的名称来冒险冲突。

您还应该注意,应该通过引用(catch (const std::exception& e)来捕获异常,并且它不会捕获不是从std::exception派生的异常。如果要捕获所有抛出的内容,请使用catch(...)

答案 1 :(得分:5)

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

而不是这样做

如果您可以对此采取措施,则只捕获异常。

答案 2 :(得分:5)

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

答案是“不要这样做。”