我知道在 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/