c++异常处理
c++ exception handling
学习"try&catch"。以下代码有什么问题?谢谢你的建议。
执行错误:
terminate called without an active exception
Aborted
代码:
#include <stdio.h>
int main()
{
int a = 3;
try
{
if (a < 5)
throw;
}
catch (...)
{
printf ("capturedn");
}
return 0;
}
throw;
语句试图重新引发当前异常,但可能没有。你需要像这样的东西
throw some_exception_object();
在try
块内部,必须指定要抛出的。唯一可以单独使用throw
的地方是在catch
块内部重新抛出当前异常。如果您在没有当前异常处于活动状态的情况下单独调用throw
,您将杀死您的应用程序,正如您已经发现的那样。
试试这个:
#include <stdio.h>
int main()
{
int a = 3;
try
{
if (a < 5)
throw 1; // throws an int
}
catch (...)
{
printf ("capturedn");
}
return 0;
}
只要你扔东西,你可以随心所欲地throw
。
有四件事,两大两小。一次做一件事。。。
1.在没有活动异常的情况下重试使用
throw;
语句用于重新引发当前捕获的异常。例如:
try {
do_something();
} catch (const std::exception &) {
throw; // This statement re-throws an exception that was caught in this "catch" block.
}
在您的情况下,您使用throw;
而没有捕获任何异常(按顺序排列——它不会直接或间接出现在catch
块内),因此您的程序终止。当需要抛出而不是重新抛出异常时,比如在您的情况下,您必须指定要抛出的异常对象。例如:
throw std::runtime_error("Something bad happened");
2.catch-all子句,它不重新抛出捕获的异常
您的包罗万象的子句(catch (...)
)是完全合法的C++。但是,它不会重新抛出捕获的异常。尽管它是一个合法的C++代码,但这样的用法是一个禁忌。C和C++运行时通常使用特殊类型的异常来实现某些功能。例如,NPTL正在使用异常来实现线程取消。如果您使用catch (...)
捕捉到该异常,线程将不会被取消,您将度过一段糟糕的时光。通常,您必须按异常的类型来捕捉异常。在几乎所有情况下,异常都是从std::exception
继承的,因此您必须编写catch (const std::exception &)
,或者,如果您希望捕获确切的类型,则必须编写-catch(const TypeYouExpect &)
。然而,如果你必须使用接球,记得重新投球。例如:
try {
do_something();
} catch (...) {
throw; // DO NOT FORGET TO RE-THROW.
}
3.标题命名
您包含了C头,而C++为标准C特性提供了自己的头。因此,标题:
#include <stdio.h>
应该是:
#include <cstdio>
C++特定的C函数得到特殊处理。例如,它们在std
命名空间中可用。因此,您可以使用std::open()
,而不仅仅是open()
或::open()
。没什么大不了的,但强烈建议你这样做。
4.从主管道返回
与C不同,C++的main()
函数非常特殊。它允许您不使用return 0;
。这是默认行为。因此,除非您真的需要返回一些值,否则您可以通过不键入return 0;
来节省一些时间。但是,请记住,main
是唯一这样的函数,并且在其他任何地方,除非函数标记为void
,否则都必须显式返回一些内容。
希望能有所帮助。祝你好运
您需要实际抛出一些对象。即使是像这样简单的东西
throw "error";
会像你希望的那样捕捉错误。
抛出异常的语句是:
throw <expression>;
此声明:
throw;
也称为重新抛出语句,用于重新抛出已捕获的现有异常。它通常用于catch
块,例如,查看异常并决定是否可以继续、重试或中止。如果您决定中止,则重新抛出异常,以便调用堆栈中的其他人能够捕获并处理此错误。
例如:
// getResult() calls can fail with a deadlock exception
// This method will retry up to 3 times before failing
Result getResultWithRetry()
{
int nbTry = 3;
for(;;) {
try {
return getResult();
} catch (DeadLockException& e) {
if (nbTry == 0) {
throw; // re-throw the deadlock exception
}
}
--nbTry;
}
}
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析