Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类构造函数引发异常 让我们考虑具有类>强> > 构造函数< /强>抛出异常< /强>如下: class Class { public: Class(type argument) { if (argument == NULL) { throw std::exception("Value cannot be null.\nParameter name: argument"); } // Instructions } private: // Properties }_C++_Class_Exception_Constructor - Fatal编程技术网

C++ C++;类构造函数引发异常 让我们考虑具有类>强> > 构造函数< /强>抛出异常< /强>如下: class Class { public: Class(type argument) { if (argument == NULL) { throw std::exception("Value cannot be null.\nParameter name: argument"); } // Instructions } private: // Properties }

C++ C++;类构造函数引发异常 让我们考虑具有类>强> > 构造函数< /强>抛出异常< /强>如下: class Class { public: Class(type argument) { if (argument == NULL) { throw std::exception("Value cannot be null.\nParameter name: argument"); } // Instructions } private: // Properties },c++,class,exception,constructor,C++,Class,Exception,Constructor,由于类构造函数可能引发异常,因此我们无法直接声明对象 Class obj(argument); // Harmful 这意味着必须调用构造函数,并且必须使用try/catch 试试看 { obj类(参数); } 捕获(标准::异常和例外) { 标准::cout 由于类构造函数可能引发异常,我们无法声明 一个直接的物体 Class obj(argument); // Harmful 是的,你可以。如果你在函数中确实有一个处理异常的计划,你只需要将它放在一个try块中。如果你没有这样的计划,那么

由于构造函数可能引发异常,因此我们无法直接声明对象

Class obj(argument); // Harmful
这意味着必须调用构造函数,并且必须使用try/catch

试试看
{
obj类(参数);
}
捕获(标准::异常和例外)
{
标准::cout
由于类构造函数可能引发异常,我们无法声明
一个直接的物体

Class obj(argument); // Harmful
是的,你可以。如果你在函数中确实有一个处理异常的计划,你只需要将它放在一个try块中。如果你没有这样的计划,那么就让异常传播(尽管你最终应该捕获它,如果没有其他计划,只需提供一个报告)

但是,假设您确实有一个计划来处理函数中的异常,那么解决方案很简单

try {
    Class obj(argument);
    // use obj here, inside the try block
}
catch(...) { ... }

// not here, outside the try block
编辑:根据你下面的评论,要么你误解了我,要么我误解了你。也许需要一个具体的例子。假设这是你使用类的函数:

void Foobar(type argument)
{
    Class obj(argument);
    obj.method1(1,2,3);
    obj.method2(3,4);
    int x = Wizbang(obj);
    gobble(x);    
}
现在,您需要处理
构造函数可能抛出的异常。我的建议是将函数中的所有垃圾放入try块,从而:

void Foobar(type argument)
{
    try
    {
        Class obj(argument);
        obj.method1(1,2,3);
        obj.method2(3,4);
        int x = Wizbang(obj);
        gobble(x);
    }
    catch(std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}
void Foobar(类型参数)
{
尝试
{
obj类(参数);
目标方法1(1,2,3);
目标方法2(3,4);
int x=威兹邦(obj);
狼吞虎咽(x);
}
捕获(标准::异常&e)
{

std::cout您想要的是不(合理地)可能的。假设有某种方法可以实现您想要的,也就是说,创建一个类类型的对象obj,它仍然在任何相关try{}catch{}之外的作用域中构造用于处理构造函数中的异常。要问自己的问题是,如果在构造obj期间抛出异常,并且您以某种方式处理了异常,然后在obj仍在作用域中的块中继续执行,那么obj到底包含什么?它从来没有构造过,所以obj中会有什么内容???

@单元格:如果他有,那么他肯定没有提供任何理由说明该选项应该被取消。当我说我不能时,我的意思是如果抛出异常,程序将爆炸。在try/catch中创建对象不是一个选项,因为我以后需要访问才能使用该对象。@rullof:确切地说,你需要在哪里使用该对象?确切地说,为什么需要使用该对象的代码不能在try块中?@rullof,事情是这样的。如果该对象创建成功,它可以安全使用。如果不成功,它就不能安全使用。离开try块意味着该对象没有成功创建。记住这一点,使用该对象不是安全的ood.如果您使用指针方法,并且构造函数抛出,您可以捕获异常并仍然在
try
-
catch
块外访问指针。但是现在呢?您有一个指针,但没有对象!异常的目的不是将最终可能抛出的每个语句封装在
try
-
catch中
阻塞,从而再次线性化控制流。发明异常的目的恰恰相反:在异常情况下(例如错误地将空指针传递给不接受空指针的构造函数后)中断正常控制流.如果我没记错的话,我在某个地方看到这不是一个真正好的设计。因此,你应该做什么来创建它而不出现异常,并检查它是否正确创建。如果你不喜欢异常,但更喜欢传统的错误处理,那么就这样做。但是如果你将函数设计为抛出异常(我更喜欢这样做)然后不要再与这种机制抗争。构造函数抛出的异常如果传递了无效参数,则应()“中断”程序。(如果希望程序继续,请不要传递无效参数。)如果我没记错的话,标准的
std::exception
没有一个构造函数将
const char*
作为参数。可能需要
std::runtime\u error
void Foobar(type argument)
{
    try
    {
        Class obj(argument);
        obj.method1(1,2,3);
        obj.method2(3,4);
        int x = Wizbang(obj);
        gobble(x);
    }
    catch(std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}