Ine*_*nce 2 c++ exception-handling exception
我一直在学习try-catch
C++中的块,我不理解该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)e
该catch
条款的参数是什么类型的?是类型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突然停止工作并崩溃.当抛出异常或者我的代码不好时,我不知道这是否正常.
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或任何其他编译器.
归档时间: |
|
查看次数: |
151 次 |
最近记录: |