当前位置: 首页 > 知识库问答 >
问题:

c如何处理抛出异常的初始化程序

巫新知
2023-03-14

很简单的问题是,如何初始化可能引发构造函数异常的类成员变量?

class main
{
public:
    main() c(...) {};
private:
    my_class c;
};

class my_class
{
public:
    inline my_class() : o(...) { };

private:
    some_obj o;
};

显然,您不能在构造函数初始化器中尝试捕获异常,因此在构造函数中的try catch块中构造对象是否更合适?

这是一个顶级类,因此处理异常以让用户知道发生了什么并优雅地退出比让程序因异常而崩溃更重要?

class main
{
public:
    main()
    {
        try
        {
            c(...);
        }
        catch(...)
        {
            ...
        }
    };
private:
    my_class c;
};

但是,这不起作用,因为对象在构造函数内初始化之前初始化一次,因此如果对象引发异常,程序可能会崩溃。

共有2个答案

申高峰
2023-03-14

为什么你不能抓住构造函数中的错误?根据这个问题,这似乎是标准做法。

凤高澹
2023-03-14

您需要的是函数-尝试-块。它是专门为解决您的问题而设计的。

class main
{
public:
    main() try : c(...)
    {
        std::cout << "constructed, c = " << c << std::endl;
    }
    catch(...)
    {
        std::cerr << "failed to construct c = " << c << std::endl;
    } // implicit throw; here

private:
    my_class c;
};
 类似资料:
  • 我有下面的代码块。我得到的是的catch块没有处理它。有人能告诉我如何处理下面的块抛出的异常吗?

  • 让我们考虑一下这段代码: 抛出MyException时,对象初始化是如何完成的?这样地: 或者像这样(所以没有初始化): 我认为使用了第一种行为,比如语句,但是关于这一点的官方文档在哪里?

  • 我正在使用Spring4和Tomcat。问题是有时我不得不在我的筛选器中抛出一个(自定义的)RuntimeException(控件甚至还没有到达控制器)。问题是,由于我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误)。我相信403禁止会比500好(对于我的定制例外)。我查看了和注释。但只有当控件到达控制器时,这些才起作用。 到目前为止,我在筛选器的中将状态手动设置为403。有没有

  • 虽然已经在响应拦截器里做了一些全局处理,最后是通过 Promise.reject 抛出的异常 现在每个接口请求方法都还是得写 try/catch 或者 .catch() 真的好麻烦 有什么比较好的方案吗?

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 问题内容: 我正面临一个用例,其中我想用一个初始化器语句声明一个字段,该语句被声明为引发一个检查异常。通常,它看起来像这样: 我在这里遇到的问题是,构造函数可能会抛出各种我不关心的检查异常(因为我知道我的名字是有效的,并且如果它不幸崩溃则可以)。Java编译器不会让我忽略这个(因为它是一个检查的异常),所以我不愿诉诸: 因为静态块确实非常难以阅读。有人对如何以一种干净的方式处理此案有建议吗? 问题