c++异常处理

c++ exception handling

本文关键字:异常处理 c++      更新时间:2023-10-16

学习"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;
}
}