关于函数有一个try-catch的东西,我认为有时可能非常有用:
bool function() try { //do something } catch(exception_type & t) { //do something }
所以问题的第一部分:这种风格在一般情况下是否被认为是不好的?
我使用这种方法的具体例子:
我们在c和c ++中有很多代码的项目.我们有自定义异常类型(不是std :: exception派生的).我需要集成XML库并将所有异常强制转换为我们的类型.所以,基本上,最后一步是从XML库中捕获所有异常并转换它们.
功能之前:
bool readEntity(...) { while(...) { if(...) { //lot's of code... } } }
后:
bool readEntity(...) try { while(...) { if(...) { //lot's of code... } } } catch(XMLBaseException & ex) { //create our exception and throw }
我的想法是这样的:我明确表示我的意图将从一种类型派生的所有异常转换为自定义类型并且我们保持我们的屏幕没有水平滚动条(因为水平滚动条是坏的).
好吧,在代码审查期间,我对这种方法的批评非常明确.
所以我想听听你的想法.
更新:要明确:重构函数不是一个选项.实际上它写得很好.
功能级try块的唯一原因是构造函数,否则它是一个有点模糊的功能,不会给你带来那么多.这样做很简单:
bool readEntity(...) { try { while(...) { if(...) { //lot's of code... } } } catch(XMLBaseException & ex) { //create our exception and throw } }
如果您遇到水平滚动问题,那么要做的就是拆分代码.try/catches是复杂性,这应该在嵌套级别表示,而不是隐藏.
在构造函数中,这是一个不同的问题:没有其他方法可以捕获初始化列表中的异常:
SomeClass::SomeClass(parameter p1, parameter p2) : Member1(p1), Member2(p2) try { } catch(Exception &ex) { // handle and rethrow }
当然,如果你有一个例外,中期施工,有没有可能什么可以做,除了日志,并和重新抛出恢复(它会得到重新抛出反正在构造函数的情况下).你的物体尚未完全构造,你无法用它做任何事情.你可以信任是有效的唯一的事情是参数(尽管如果初始化失败,那将可能是由于恶劣参数).
有关此问题的讨论,请参阅此GOTW.