C++中的异常是否仅用于提高可读性?

Are exceptions in C++ only used to improve readability?

本文关键字:可读性 用于 异常 是否 C++      更新时间:2023-10-16

我目前很难掌握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++中的throwtrycatchstd::exception一样。

另一种是硬件异常,例如,如果除以零或尝试访问不属于进程的内存页,会发生什么情况。

C++异常和硬件异常是分开的,不能使用C++异常来捕获硬件异常。如您所知,您只能catchthrow显式创建的异常。

但是,许多操作系统都有捕获硬件异常的方法,例如可以在POSIX系统上使用信号(例如,在尝试未分配的页面访问时SIGSEGV等(。这使得它主要依赖于操作系统。但也要注意,许多硬件异常无法从中恢复,您可以捕获它们,但无论如何都不会真正以任何有意义的方式继续。