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