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

Ine*_*nce 2 c++ exception-handling exception

我一直在学习try-catchC++中的块,我不理解该catch函数的语法.在cppreference上,它说如下:

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

catch (const std::exception& e) { /* */ }
Run Code Online (Sandbox Code Playgroud)

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

catch (const std::exception&) { /* */ }
Run Code Online (Sandbox Code Playgroud)

3)编写一个"catch-all handler"(不确定这意味着什么),它被激活用于任何异常:

catch (...) { /* */ }
Run Code Online (Sandbox Code Playgroud)

问题:

1)这些catch块之间有什么区别?我不确定形式参数,未命名参数和"catch-all handler"有何不同.

2)ecatch条款的参数是什么类型的?是类型exception吗?除了示例中,我从未见过如何编写try-catch块的类型.如果是这样,我怎么能在一个catch子句中使用它,比方说,输出一条错误信息?e当我抛出错误时,可以接受我发送的字符串吗?

3)我已经尝试并编写了try-catch如下块:

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

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

catch(const string& e)
{
    cout << e;
}
Run Code Online (Sandbox Code Playgroud)

此代码成功调用catch块并打印我的消息:"Error, program stopped.".但是,.exe突然停止工作并崩溃.当抛出异常或者我的代码不好时,我不知道这是否正常.

Ben*_*ley 7

catch (const std::exception& e) { /* */ }
Run Code Online (Sandbox Code Playgroud)

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

catch (const std::exception&) { /* */ }
Run Code Online (Sandbox Code Playgroud)

如果不需要访问异常对象,则可以使用未命名的异常.也许你不关心异常的内容,你只想以同样的方式处理所有异常(这种类型).

catch (...) { /* */ }
Run Code Online (Sandbox Code Playgroud)

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

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