5

学习“try & catch”。以下代码有什么问题?感谢您的建议。

执行错误:

terminate called without an active exception
Aborted

编码:

#include <stdio.h>
int main()
{
  int a = 3;

  try
  {
    if (a < 5)
      throw;
  }
  catch (...)
  {
    printf ("captured\n");
  }

  return 0;
}
4

5 回答 5

5

您的throw;语句试图重新抛出当前异常,但可能没有。你需要类似的东西

throw some_exception_object();
于 2012-10-16T00:07:23.750 回答
4

try块内,您必须指定抛出的内容。您可以单独使用的唯一位置throw是在catch块内重新抛出当前异常。如果您throw在当前异常处于活动状态的情况下自行调用,您将杀死您的应用程序,正如您已经发现的那样。

试试这个:

#include <stdio.h> 

int main() 
{ 
  int a = 3; 

  try 
  { 
    if (a < 5) 
      throw 1; // throws an int 
  } 
  catch (...) 
  { 
    printf ("captured\n"); 
  } 

  return 0; 
} 

你可以throw随心所欲,只要你扔东西。

于 2012-10-16T00:09:30.760 回答
4

有四件事,两件大事,两件小事。一心一意...

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 &)。但是,如果您必须使用 catch-all,请记住重新投掷。例如:

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()or ::open()。没什么大不了的,但强烈推荐去。

4. 从主返回。

与 C 不同,C++ 的main()功能非常特殊。它让你没有return 0;。这是默认行为。所以,除非你真的需要返回一些值,否则你可以通过不输入来节省一些时间return 0;。但是请记住,这main是唯一的函数,并且在其他任何地方都必须显式返回某些内容,除非函数被标记为void

希望能帮助到你。祝你好运!

于 2012-10-16T00:21:03.913 回答
1

您实际上需要扔一些物体。甚至像这样简单的事情

throw "error";

会像你想要的那样捕捉错误。

在这里看到它的作用

于 2012-10-16T00:09:31.613 回答
1

抛出异常的语句是:

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;
    }
}
于 2012-10-16T00:27:06.050 回答