gpt4 book ai didi

C++ 异常问题

转载 作者:行者123 更新时间:2023-11-28 00:43:55 25 4
gpt4 key购买 nike

我在处理 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 唯一可以接收的是一个不适合任何其他异常类型的数字/ float /字符?老实说,我对标准异常感到很困惑。

4) 同样,在标准异常中,class myexception: public exception 中的exceptions 是构造函数吗?

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

最佳答案

这个答案可能超出了您的水平,但我希望它至少能让您对抛出异常时发生的情况有一个基本的了解。它至少会为您提供一些可通过 google 搜索的术语。

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

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

一个说明性的例子:

#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 block 进入
  4. bam() 被调用
  5. int 是动态分配的。构造一个指向int 的指针,名为i,具有自动存储持续时间(在堆栈上)
  6. 创建了一个包含指向另一个动态分配的 int 的指针的 unique_ptr 对象。
  7. boo() 被调用
  8. 构造了一个具有自动存储持续时间的int
  9. my_exception 类型的对象已构建,堆栈展开开始。
  10. boo()被留下,local被破坏(清理)
  11. 我们回到了 bam() 并将其抛在后面:首先调用了 j 的析构函数,它调用了 delete值为 43 的整数。然后指针对象i被析构,但是它指向的整数不是deleted。我们有内存泄漏(永远不会到达 delete i; 语句)。
  12. 我们回到了 f(),一个友好的 catch 捕获了我们的 my_exception 并输出了 message 通过 std::cout

回答您的问题:

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

2) 见上文。

3) catch“接收”一个对象。它的工作方式很像函数重载。最好的一个被挑选出来。如果没有匹配项,则继续展开。 e 不“接收”任何东西。它可能由抛出的任何东西构成,但这需要 e 的类型具有正确的转换/构造函数。

4) No. 指定继承。示例:

#include <stdexcept>

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

这个my_exception类继承了std::exception中定义的what()函数,所以我不需要自己定义.

关于C++ 异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17359018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com