Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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++ 为什么catch中的代码不能执行_C++_Exception - Fatal编程技术网

C++ 为什么catch中的代码不能执行

C++ 为什么catch中的代码不能执行,c++,exception,C++,Exception,我有一个Foo类,如下所示 Foo.h #pragma once class Foo { public: Foo() = default; ~Foo() = default; void DoSomething(); }; Foo.cpp #include "Foo.h" void Foo::DoSomething() { throw "something happened"; } 我使用的类是: #include <iostream> #inc

我有一个Foo类,如下所示

Foo.h

#pragma once
class Foo
{
public:
    Foo() = default;
    ~Foo() = default;

    void DoSomething();
};
Foo.cpp

#include "Foo.h"

void Foo::DoSomething()
{
    throw "something happened";
}
我使用的类是:

#include <iostream>
#include "Foo.h"

int main()
{
    try
    {
        Foo foo;
        foo.DoSomething();
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}
#包括
#包括“Foo.h”
int main()
{
尝试
{
富富,;
foo.DoSomething();
}
捕获(标准::异常&e)
{
当你这样做的时候

throw "something happened"
您没有抛出一个
std::exception
。您正在抛出一个类型为
const char[N]
的字符串文本。要捕获它,您需要一个如下的catch块

catch (const char* e)
{
    std::cout << e << std::endl;
}
您还可以指定默认处理程序,如

catch (...)
{
    std::cout << "something bad happened - cannot recover" << std::endl;
}
捕获(…) { 当你这样做的时候

throw "something happened"
您没有抛出一个
std::exception
。您正在抛出一个类型为
const char[N]
的字符串文本。要捕获它,您需要一个如下的catch块

catch (const char* e)
{
    std::cout << e << std::endl;
}
您还可以指定默认处理程序,如

catch (...)
{
    std::cout << "something bad happened - cannot recover" << std::endl;
}
捕获(…) {
STD::CUD>代码>“发生的事情”<代码>是<代码> const char */COD>,不是<代码> STD::异常< /代码>。@ BCK不是C++中的。我们最近的是“代码> catch(…))< C++ >代码>它将捕获任何东西,但实际上不能访问所抛出的任何内容,因此只能有一个通用的消息,如<代码>坏的发生< /COD> <代码> > catch(…)>代码> java,在发生“某事发生”时,所有的异常都会出现在该位置。“发生了异常情况”@user463035818:它们比编写显式错误处理逻辑手动解除堆栈(成本和可维护性)更便宜。当出现无法在本地修复的错误时抛出异常。
“发生了异常情况。”“是一个代码> const char */c>,不是<代码> STD::异常< /代码>。@ BCK不是C++中的。我们最近的是“代码> catch(…)”/>代码>它将捕获任何东西,但实际上不能访问所抛出的任何内容,因此只能有一个通用的消息,如<代码>坏的事情< /代码>是的<代码> catch(…)在java中,当发生“某事”时,你的投注异常都在整个地方。C++中的异常并不是很便宜,而是在“特殊情况发生”的情况下使用的。USER 463035818:它们比写显式错误处理逻辑更廉价,手动地解压缩堆栈(既有成本又有可维护性)。。当出现无法在本地修复的错误时抛出异常。或者使用
catch(…)
@user463035818捕获任何内容。在查看操作说明
catch(…)
中的注释后,刚刚添加了这一点。您可以使用Lippincott函数重新显示异常并捕获特定异常,以提供更多详细信息(如果可能).我有一个
log\u异常
函数,用于
try(…)
阻塞并尝试捕获特定于我的应用程序的异常,如果可以,则记录这些异常,否则它会捕获
std::exception
并记录它可以记录的内容。最后,它只是放弃并执行
throw;
来重新显示异常,以便任何人都能更好地处理异常,而不仅仅是记录异常。或者使用
catch(…)捕获任何异常
@user463035818在看到OPRegarding
catch(…)
的评论后,刚刚添加了这一点。您可以使用Lippincott函数重新显示异常并捕获特定的异常,以提供更多细节(如果可能)。我有一个
log_exception
函数用于
try(…)
阻塞并尝试捕获特定于我的应用程序的异常,如果可以,则记录这些异常,否则它将捕获
std::exception
并记录它可以记录的内容。最后,它只是放弃,并执行
抛出;
来重新显示异常,以便任何人都能更好地处理,而不仅仅是记录。