C++中的异常是否仅用于提高可读性?
Are exceptions in C++ only used to improve readability?
我目前很难掌握C++异常的目的/用途。
在我更熟悉的其他语言中,例如 C# 如果出现问题,会自动抛出异常。例如,除以零或 acess 冲突,因为您获得了未分配的引用。我过去在这些语言中所做的是将我的代码部分包装在try/catch块中,在那里可能会发生可怕的事情。例如,处理来自可能已损坏的文件的数据。
现在,在深入研究C++时,我注意到除以零和段错误都不会产生异常:
#include<iostream>
void produceCrash()
{
int i = 1/0; // program just crashes no exception
int* p;
*p = 10; // same thing here
}
int main()
{
try
{
produceCrash();
}
catch(const std::exception& e)
{
std::cerr << e.what() << std::endl;
}
catch(...)
{
std::cerr << "Exception thrown!" << std::endl;
}
return 0;
}
据我了解,只能捕获由 throw 显式抛出的异常。这意味着任何意外的错误都无法捕获。这是否意味着C++中的异常只是错误代码返回等内容的(更干净,更具可读性(替代方案,并且只是控制程序流的一种方式?
不幸的是,有两种例外很容易被初学者混淆:
首先是基于语言的例外,就像C++中的throw
、try
、catch
和std::exception
一样。
另一种是硬件异常,例如,如果除以零或尝试访问不属于进程的内存页,会发生什么情况。
C++异常和硬件异常是分开的,不能使用C++异常来捕获硬件异常。如您所知,您只能catch
由throw
显式创建的异常。
但是,许多操作系统都有捕获硬件异常的方法,例如可以在POSIX系统上使用信号(例如,在尝试未分配的页面访问时SIGSEGV
等(。这使得它主要依赖于操作系统。但也要注意,许多硬件异常无法从中恢复,您可以捕获它们,但无论如何都不会真正以任何有意义的方式继续。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- C++中的异常是否仅用于提高可读性?
- GCC是否优化STD :: TIE仅用于可读性