gpt4 book ai didi

c++ - C++ 中的函数范围异常处理——这是一种糟糕的风格吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:55 24 4
gpt4 key购买 nike

关于函数有一个 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 block 的唯一原因是构造函数,否则它是一个有点晦涩的功能,不会给你带来太多好处。这样做同样容易:

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对此进行讨论。

关于c++ - C++ 中的函数范围异常处理——这是一种糟糕的风格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/620795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com