使用Define来抛出异常

时间:2014-05-30 09:13:37

标签: c++ exception throw

目前,我正在重构一些由我们的前工作人员撰写的旧项目。我遇到了使用define包装抛出异常。

类似的东西:

#define THROWIT(msg) throw common::error(msg)

代码示例:

#define THROW_FD_ERROR( fd, op )\
throw common::error_fd( errno,\
    __ERR_FD_API_3\
    .arg( fd )\
    .arg( op )\
    .arg( strerror(errno) ),\
    __FILE__,\
    __LINE__ )

我可以看到它的一些好处,但对我来说,以这种方式做到这一点并不是那么大。 无论如何,这是一种常见的技术吗? 在您看来,从中可以获得哪些优势? 您是否使用定义来抛出异常? 如果是的话是什么目的?

UPD:从代码中添加define

UPD2:谢谢大家的回答。我决定取出所有的宏。为了进行debuging,我将使用backtrace信息扩展基本错误类,在我看来,它比仅使用文件和行的标准定义更好。

5 个答案:

答案 0 :(得分:3)

通常,仅在需要预处理程序特定功能(如__FILE____LINE__)时才使用预处理程序。这个宏没有做什么功能,因此它非常不典型和坏。

答案 1 :(得分:3)

所呈现的宏并没有带来很多好处。

但是,如果要在异常消息中包含文件名,函数名和行号,宏可以有一个好处:

#define POSSIBLY_USEFUL_THROWIT(msg) throw common::error(__FILE__, __FUNCTION__, __LINE__, msg)

哦,THROWIT是一个可怕的名字。


Alf强调了一个好点:

  

您可以使用宏来收集信息,这是唯一的方法   去做吧。然而,将其与抛出异常联系起来就是一个例外   责任的混淆。这意味着你需要单独的   此类宏用于记录,UI消息等。一个宏会   更好。

我认为他的意思是拥有这样的东西:

// Construct new temporary object source_line_info
#define CURRENT_SRC_LINE_INFO() common::source_line_info(__FILE__, __FUNCTION__, __LINE__)

然后像这样使用它:

throw common::error(CURRENT_SRC_LINE_INFO(), msg);

只有那部分宏才真正需要它。

就个人而言,我更愿意拥有像

这样的额外宏
#define THROW_COMMON_ERROR(...)  throw common::error(CURRENT_SRC_LINE_INFO(), ...

因为如果我将进行"宏调用"在多行中,我也可以尽可能简短和集中,即使这意味着引入另一个宏。

答案 2 :(得分:1)

没有。别。坏。它使代码更难理解,输入的时间也不短。

如果你真的必须,请使用一个功能。但在这种情况下,我不认为你真的必须。

答案 3 :(得分:1)

优点是键入的字符较少,您可以在单个点(宏)更改throw声明(如抛出另一种类型)。但是,您也可以使用常用功能而不是宏。使用函数可以完全相同的宏被认为是不好的做法,因为宏有问题(比如没有作用域和可能污染包含宏定义头的其他文件。宏是最多的工具,当没有其他的时候使用语言功能可以做同样的事情,你迫切需要它。

因此,我不会考虑这种良好做法。

答案 4 :(得分:1)

不,在C ++中使用内联函数会更好。无需编译器检查即可替换宏。在没有其他方法执行任务的情况下,应该使用预处理器宏。