【发布时间】:2023-03-19 00:30:01
【问题描述】:
函数try块是函数体的一种特殊形式,例如:
int f() try {
// function body
}
catch {
// one or more catch-clauses.
}
主要用途是在构造函数中使用,以便记录任何基类的构造函数抛出的异常。但是,也允许在常规函数中使用它们。
在这方面存在一些(相当老的)问题,询问我们为什么需要它用于常规功能,例如Function try blocks, but not in constructors。但是,我的问题更多的是在另一个方向上:我可以在常规函数中使用它来替代常规的 try-block 而不用担心吗?比方说,只是出于审美原因?
我为 C++ 库开发了一个 C 接口,需要用 try 块封装每个接口函数以捕获任何异常。因此,我想避免在每个函数中使用额外的大括号块......
只有一件事引起了我的担忧:在答案https://stackoverflow.com/a/11535436/6695750 中,davka 引用了 2000 年的一篇文章,声称您不能从对应于函数尝试块的捕获块返回值。我用 gcc 5.4.0 进行了测试,在那里我可以毫无问题地从 catch-block 返回一个值。这是标准,还是 gcc 的非标准扩展?
【问题讨论】:
-
我没有看到任何陷阱,除了构造函数/析构函数会重新抛出。
-
second answer you're quoting 完全是错误的(在创建时就已经如此)。
-
一个(小)陷阱是它出乎意料。如果您保持代码简单(C 层只调用 C++ 层并处理异常),那很好。如果您的代码随着时间的推移变得更加复杂/复杂(就像我的一些人所做的那样:))这可能会在这些年来变得很麻烦 - 那么您最好使用异常处理函数并将您的 C++ 代码作为访问者传递给它/ lambdas。
标签: c++ c++11 exception-handling function-try-block