我知道在互联网上必须有很多关于这个主题的文档。 但是在没有正确答案的情况下进行数小时的研究是令人沮丧的所以我认为我不能用一句好话来表达我的问题。所以这里是完整版:
我正在做关于try-catch的演示,但是做基本的事情是相当无聊的。我知道尝试捕获的是什么,我知道它是如何工作的。 但是这里有魔术:让我们假设我使用C ++。
编译器将在堆上创建一个只读列表,其中的结构提供有关try-block中函数的信息。其中包括例程开始和结束的指针,有关异常对象类型的信息等。 (如果我错了,请纠正我)
好。现在发生异常。所谓的错误处理程序(我们这里,谁是错误处理程序?)将查找有关失败例程的所有数据并获取适当的catch例程。通过将通过错误生成的异常对象与catch中的异常对象进行比较,可以找到正确的catch。
例如:创建InvalidCastException(或类似的东西)。有一个问题,处理错误,并在try块中创建的所有对象都被销毁。
但是:该程序如何注意到存在异常?这是由程序,运行时还是处理器处理的(我读过有关Ring0和Ring1的内容,CPU中的不同级别)。
答案 0 :(得分:1)
在C ++中有两种实现异常处理的方法。首先是使用Itanium ABI零成本异常处理。第二个是使用一对setjmp/longjmp
来处理异常的控制流。第一个是每个现代编译器的首选实现。
程序不会“监听”异常,因此它不会注意到异常。相反,它会将它们作为控制流程的一部分进行处理。例如,“throw”总是引发异常,触发将执行转移到异常处理代码。
即使这些异常在C ++中大量使用,它提供了一个很好的“抛出”和“捕获”它们的接口,它们也可以在C中使用,甚至在Linux内核中使用。
您可以在这里阅读更多内容: