c++ - 错误处理程序如何在内部工作?

标签 c++ error-handling try-catch

我知道在 Internet 上必须有很多关于这个主题的文档。 但是在没有正确答案的情况下进行数小时的研究是非常令人沮丧的。所以我想我不能用一个好词组来表达我的问题。所以这里是完整版:

我正在做一个关于 try-catch 的演示,但是做一些基本的事情相当无聊。我知道 try catch 是什么,我知道它是如何工作的。 但魔法来了:假设我使用 C++。

编译器将在堆上创建一个只读列表,其中包含提供有关 try block 中函数信息的结构。这包括例程开始和结束的指针、有关异常对象类型的信息等。 (如有错误请指正)

好的。现在出现异常。所谓的错误处理程序(我们开始吧,谁是错误处理程序?)将查找有关失败例程的所有数据并获得适当的捕获例程。通过将错误产生的异常对象与catch中的异常对象进行比较,找到正确的catch。

例如:创建了 InvalidCastException(或类似的东西)。有一个陷阱,错误被处理并且在 try block 中创建的所有对象都被销毁。

但是:程序怎么能注意到有异常呢?这是由程序、运行时还是处理器处理的(我读了一些关于 Ring0 和 Ring1 的内容,CPU oO 中的不同级别)。

最佳答案

在 C++ 中有两种实现异常处理的方法。首先是使用 Itanium ABI 零成本异常处理。第二种是使用一对 setjmp/longjmp 来处理异常的控制流。第一个是每个现代编译器的首选实现。

程序不会“监听”异常,因此不会注意到异常。相反,它将它们作为控制流的一部分提出并处理。例如,“throw”总是引发异常,触发将执行转移到异常处理代码。

尽管这些异常在 C++ 中被大量使用,它提供了一个很好的接口(interface)来“抛出”和“捕获”它们,但它们也在 C 中使用,甚至在 Linux 内核中。

您可以在这里阅读更多内容:

关于c++ - 错误处理程序如何在内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9454676/

相关文章:

c++ - 将数据写入文件的 'best' 方法是什么,稍后再次读入。

C++11 枚举转发导致 "underlying type mismatch"

Java io丑陋的try-finally block

ios - Objective C - 捕获从 block 内部引发的异常

c++ - SFML- sleep 计算

关于传递对象的 C++ 约定(指针与引用)

php - 使用xampp访问localhost上的html/php文件时出现错误404

.htaccess - .htaccess不会重定向到错误页面

c++ - Fortran 子程序的 Qt 错误处理

java - 异常抛出或捕获并尝试