目前,我正在重构一些由我们的前工作人员撰写的旧项目。我遇到了使用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信息扩展基本错误类,在我看来,它比仅使用文件和行的标准定义更好。
答案 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 ++中使用内联函数会更好。无需编译器检查即可替换宏。在没有其他方法执行任务的情况下,应该使用预处理器宏。