C++ 为什么catch中的代码不能执行
我有一个Foo类,如下所示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.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在看到OPRegardingcatch(…)
的评论后,刚刚添加了这一点。您可以使用Lippincott函数重新显示异常并捕获特定的异常,以提供更多细节(如果可能)。我有一个log_exception
函数用于try(…)
阻塞并尝试捕获特定于我的应用程序的异常,如果可以,则记录这些异常,否则它将捕获std::exception
并记录它可以记录的内容。最后,它只是放弃,并执行抛出;
来重新显示异常,以便任何人都能更好地处理,而不仅仅是记录。