繁体   English   中英

C ++出现异常的麻烦

[英]C++ trouble with Exceptions

我在C ++中遇到异常时遇到了麻烦,涉及异常的结构以及如何传递参数等等。

在此页面上: http : //www.cplusplus.com/doc/tutorial/exceptions/

1)当您扔东西时,例如: throw 20; ,您是否将20传递给int e ,如果是这样,如果仅通过键入命令以给出屏幕响应,则抛出整数来捕捉是什么意思?

2)如果程序遇到异常并引发异常,则程序会去捕获以解决程序中的问题,还是程序会去捕获以仅响应已发生错误并且您需要修复该错误程序。

3)看看标准异常部分:底部显示的异常( bad_allocbad_castbad_exception等)应该是可以传递给变量的异常类型吗? 就像您说catch(bad_exception& e)一样, e唯一能接收的数字/浮点数/字符不适合任何其他异常类型? 老实说,我对标准异常非常困惑。

4)在标准异常,再次是exceptions中的class myexception: public exception构造?

抱歉,很长的帖子。 非常感谢任何简化主题,建议或帮助的在线教程。 谢谢 :)

这个答案可能超出您的水平,但我希望它至少使您对引发异常时发生的情况有基本的了解。 它至少会给您一些可谷歌搜索的术语。

throw语句不是立即函数调用。 这是程序中构造特定对象的点(可以是intstd::exceptionstd::runtime_error任何其他类型的对象)。

构建异常对象后,将堆栈展开。 这是一个重要的概念,我将尝试用几句话勾勒出来。 展开堆栈意味着以相反的顺序遍历您已调用的所有函数,并且破坏了那些函数中(在堆栈上)分配的所有对象。 此过程将继续进行,直到到达捕获异常类型的catch块为止(正常的函数重载解析规则在此处适用,因此可以进行转换)。

一个示例:

#include <iostream>
#include <memory>
#include <string>

class my_exception
{
public:
  my_exception(const std::string& message) : message(message) {}
  const std::string& what() { return message; }
private:
  const std::string message;
};

void boo()
{
  int local = 5; // local, "automatic storage duration" variable
  throw my_exception("boo threw");
}
void bam()
{
  int* i = new int(42); // dynamically allocated int, unowned, accessible
  std::unique_ptr<int> j(new int(43)); // dynamically allocated int, owned by a smart pointer with automatic storage duration
  boo();
  delete i;
}

void f()
{
  try
  {
    bam();
  }
  catch(const my_exception& e)
  {
    std::cout << e.what();
  }
}

int main()
{
  f();
}

出汗的过程如下:

  1. main输入
  2. f()被称为
  3. 输入try
  4. bam()被称为
  5. 一个int是动态分配的。 构造一个指向具有自动存储持续时间的名为i int的指针(在堆栈上)
  6. 创建一个unique_ptr对象,该对象包含指向另一个动态分配的int的指针。
  7. boo()被称为
  8. 一个具有自动存储期限的int构造。
  9. 构造了类型为my_exception的对象,然后开始展开堆栈。
  10. 留下boo() ,并且销毁local (清除)
  11. 我们回到了bam()并留下了它:首先调用j的析构函数,该析构函数对值为43的整数调用delete 然后,指针对象i被销毁,但是它指向的整数不是delete d。 我们发生内存泄漏( delete i;语句从未到达)。
  12. 我们回到f() ,其中一个友好的catch捕获了my_exception并通过std::cout输出message

要回答您的问题:

1)不,会发生一个更复杂的过程,该过程最终在步骤12中结束,该过程可能类似于函数调用,但实际上并非如此。

2)见上文。

3) catch “接收”物体。 它的工作原理类似于函数重载。 最好的一个被选中。 如果没有匹配项,则展开继续。 e没有“接收”任何东西。 它可以根据抛出的任何内容进行构造,但是这要求e的类型具有正确的转换/构造函数。

4)不。它指定继承。 例:

#include <stdexcept>

class my_exception : public std::exception
{
public:
  my_exception(const std::string& message) : std::exception(message) {}
}

这个my_exception类继承了std::exception定义的what()函数,因此我不需要自己定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM