gpt4 book ai didi

c++ - 如何转换 boost::exception?

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:01 25 4
gpt4 key购买 nike

考虑以下示例(取自 https://theboostcpplibraries.com/boost.exception )

#include <boost/exception/all.hpp>
#include <exception>
#include <new>
#include <string>
#include <algorithm>
#include <limits>
#include <iostream>

typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info;

struct allocation_failed : public std::exception
{
const char *what() const noexcept { return "allocation failed"; }
};

char *allocate_memory(std::size_t size)
{
char *c = new (std::nothrow) char[size];
if (!c)
BOOST_THROW_EXCEPTION(allocation_failed{});
return c;
}

char *write_lots_of_zeros()
{
try
{
char *c = allocate_memory(std::numeric_limits<std::size_t>::max());
std::fill_n(c, std::numeric_limits<std::size_t>::max(), 0);
return c;
}
catch (boost::exception &e)
{
e << errmsg_info{"writing lots of zeros failed"};
throw;
}
}

int main()
{
try
{
char *c = write_lots_of_zeros();
delete[] c;
}
catch (boost::exception &e)
{
std::cerr << *boost::get_error_info<errmsg_info>(e);
}
}

函数 allocate_memory() 使用以下语句抛出异常

BOOST_THROW_EXCEPTION(allocation_failed{});

在 catch block 中,如何将 boost::exception &e 转换回 allocation_failed

此外,如果我的代码有多个 throw 语句,例如 BOOST_THROW_EXCEPTION(A{})BOOST_THROW_EXCEPTION(B{})BOOST_THROW_EXCEPTION(C{}) 等。其中 A、B、C 是类。在不使用 boost 的情况下,我可以通过以下方式为每种类型的异常设置单独的 catch block 。

...
catch(A e){
...
}
catch(B e){
...
}
catch(C e){
...
}

我如何在使用 boost 时做同样的事情,以便 BOOST_THROW_EXCEPTION(A{}), BOOST_THROW_EXCEPTION(B{}), BOOST_THROW_EXCEPTION (C{})等转到不同的catch block ?

我是 boost 库的新手,它的一些概念让我难以理解。

最佳答案

BOOST_THROW_EXCEPTION 除了继承 boost::exception 之外,总是抛出一个继承其参数类型的类型。这意味着两件事:

  1. 您可以从 boost::exception dynamic_cast 到传递的类型。

-

catch (boost::exception &e)
{
std::cerr << *boost::get_error_info<errmsg_info>(e);
if ( allocation_failed* af = dynamic_cast<allocation_failed*>(&e) )
{
std::cerr << af->what() << std::endl; // redundant
}
}
  1. 您可以直接捕获传递的类型。但是,您应该始终通过引用来捕捉以避免切片。 (此建议与您是否使用 boost 或其他任何东西无关。)

-

catch (A& a) {
// ...
} catch (B& b) {
// ...
} catch (C& c) {
// ...
}

当然,这样做,如果你想要任何boost的错误格式或额外数据,你需要然后dynamic_cast异常对象到boost::exception*.

关于c++ - 如何转换 boost::exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44248218/

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