gpt4 book ai didi

C++ - 不理解 try-catch 中 catch 函数的语法

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:22 25 4
gpt4 key购买 nike

我一直在学习 C++ 中的 try-catch block ,但我不了解 catch 函数的语法。在 cppreference 上,它表示如下:

1) 在catch子句中声明形参:

catch (const std::exception& e) { /* */ }

2) 声明一个未命名的参数:

catch (const std::exception&) { /* */ }

3) 编写一个“包罗万象的处理程序”(不确定这是什么意思),任何异常都会激活它:

catch (...) { /* */ }

问题:

1) 这些 catch block 之间有什么区别?我不确定形式参数、未命名参数和“包罗万象的处理程序”有何不同。

2) catch 子句的参数e 是什么类型?它是 exception 类型吗?除了在如何编写 try-catch block 的示例中,我从未见过这种类型。如果是这样,我如何在 catch 子句中使用它来输出错误消息?当我抛出错误时,e 可以接受我发送的字符串吗?

3) 我已经试验并编写了一个 try-catch block ,如下所示:

#include <iostream>
#include <string>
#include <stdexcept>

try
{
throw invalid_argument("Error, program stopped.");
}

catch(const string& e)
{
cout << e;
}

此代码成功调用了 catch block 并打印了我的消息:“错误,程序已停止。”。但是,.exe 突然停止工作并崩溃。不知道这是抛出异常时的正常情况,还是我的代码有问题。

最佳答案

catch (const std::exception& e) { /* */ }

如果您希望能够访问 catch block 中的异常对象,则需要使用命名异常。例如,如果你想打印 e.what() .

catch (const std::exception&) { /* */ }

如果您不需要访问异常对象,您可以使用未命名的异常。也许您并不关心异常的内容,而只想以相同的方式处理所有(此类)异常。

catch (...) { /* */ }

C++ 允许您抛出任何类型的对象,无论它是否是从std::exception 派生的类型。 .这种类型的 catch block 将捕获任何抛出的东西。就像未命名的异常一样,您将无权访问抛出的对象。而且,您甚至无法知道它是什么类型。

对于您的最后一个示例,我认为不是您的 catch block 正在打印消息。毕竟,你抓错了类型。一些编译器会自动插入异常捕获代码,捕获任何从 main 转义的内容,如果它是从 std::exception 派生的类型。 , 它将打印 what() 的结果, 在终止程序之前。我相信 GCC 会这样做,但 Visual Studio 不会。不确定 Clang 或任何其他编译器。

关于C++ - 不理解 try-catch 中 catch 函数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603687/

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