代码之家  ›  专栏  ›  技术社区  ›  MBZ

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

  •  0
  • MBZ  · 技术社区  · 16 年前

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

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

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

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

    有什么解决办法吗?

    3 回复  |  直到 16 年前
        1
  •  14
  •   Stack Overflow is garbage    16 年前

    这是处理异常的可怕方法。如果抛出异常,则是因为发生了错误。那你要么 手柄 错误,解决发生的问题,或允许它终止程序。

    这个例外毫无意义。

    至少,您应该在记录异常后重新显示它。更改 END_FUNCTION 宏以包含 throw; . 这也可以解决您遇到的编译器错误。

    名称:

    • 以下划线开头,后跟大写字母

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

    用这样的名字会有冲突的危险 在任何地方

    您还应该注意,捕获异常应该通过引用来完成( catch (const std::exception& e) ,并且它不会捕获非派生自 std::exception . 如果你想抓住所有抛出的东西,使用 catch(...) .

        2
  •  5
  •   Jeff Foster    16 年前

    与其这样做,为什么不让异常冒泡到顶部并在一个地方处理呢?

    只有在你能做点什么的时候才能捕捉异常。

        3
  •  5
  •   EricBoersma    16 年前

    我知道你不想听,但答案是在合适的时候只包含try/catch块。你在这里要做的基本上是非常非常懒惰,以一种几乎没有任何好处的方式。更糟糕的是,因为你把所有的事情都当作一个普通的异常来处理,而且没有一个异常是值得处理的。

    答案是“不要这样做”