[英]C++ trouble with Exceptions
我在C ++中遇到异常时遇到了麻烦,涉及异常的结构以及如何传递参数等等。
在此页面上: http : //www.cplusplus.com/doc/tutorial/exceptions/
1)当您扔东西时,例如: throw 20;
,您是否将20
传递给int e
,如果是这样,如果仅通过键入命令以给出屏幕响应,则抛出整数来捕捉是什么意思?
2)如果程序遇到异常并引发异常,则程序会去捕获以解决程序中的问题,还是程序会去捕获以仅响应已发生错误并且您需要修复该错误程序。
3)看看标准异常部分:底部显示的异常( bad_alloc
, bad_cast
, bad_exception
等)应该是可以传递给变量的异常类型吗? 就像您说catch(bad_exception& e)
一样, e
唯一能接收的数字/浮点数/字符不适合任何其他异常类型? 老实说,我对标准异常非常困惑。
4)在标准异常,再次是exceptions
中的class myexception: public exception
构造?
抱歉,很长的帖子。 非常感谢任何简化主题,建议或帮助的在线教程。 谢谢 :)
这个答案可能超出您的水平,但我希望它至少使您对引发异常时发生的情况有基本的了解。 它至少会给您一些可谷歌搜索的术语。
throw
语句不是立即函数调用。 这是程序中构造特定对象的点(可以是int
, std::exception
, std::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();
}
出汗的过程如下:
main
输入 f()
被称为 try
块 bam()
被称为 int
是动态分配的。 构造一个指向具有自动存储持续时间的名为i
int
的指针(在堆栈上) unique_ptr
对象,该对象包含指向另一个动态分配的int
的指针。 boo()
被称为 int
构造。 my_exception
的对象,然后开始展开堆栈。 boo()
,并且销毁local
(清除) bam()
并留下了它:首先调用j
的析构函数,该析构函数对值为43
的整数调用delete
。 然后,指针对象i
被销毁,但是它指向的整数不是delete
d。 我们发生内存泄漏( delete i;
语句从未到达)。 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.