【发布时间】:2012-03-16 07:34:15
【问题描述】:
我知道互联网上肯定有很多关于这个主题的文档。 但是在没有正确答案的情况下进行数小时的研究是非常令人沮丧的。所以我想我不能用一个好的短语来表达我的问题。所以这里是完整版:
我正在做一个关于 try-catch 的演示,但是做一些基本的事情相当无聊。我知道 try catch 是什么,也知道它是如何工作的。 但神奇的地方来了:假设我使用 C++。
编译器将在堆上创建一个只读列表,其结构提供有关 try 块中函数的信息。这包括例程开始和结束的指针,有关异常对象类型的信息等等。 (如有错误请指正)
好的。现在出现异常。所谓的错误处理程序(在这里,错误处理程序是谁?)将查找有关失败例程的所有数据并获取适当的 catch 例程。通过将错误产生的异常对象与catch中的异常对象进行比较,找到正确的catch。
例如:创建了 InvalidCastException(或类似的东西)。有一个问题,错误被处理并且在 try 块中创建的所有对象都被销毁。
但是:程序怎么能注意到有异常呢?这是由程序处理,由运行时处理,还是由处理器处理(我读过一些关于 Ring0 和 Ring1 的东西,CPU oO 中的不同级别)。
【问题讨论】:
-
听起来您已经阅读过有关操作系统异常和 C++ 异常的信息,并将它们视为相同。他们不是。 C++ 异常与 CPU 的关系与任何其他语言结构无关。如果你想合理化异常实现,你将不得不指定一个特定的工具链。
-
好的,我对 C++ 异常感兴趣。但我无法想象错误处理将如何工作。我的意思是 - 我的程序如何注意到有异常?我需要操作系统吗?还是我不需要这些?
-
“通知”是什么意思?当出现异常时,它会“通知”,就像在调用函数或设置变量时“通知”一样;它被编程为这样做。从 C++
try语句生成的机器代码执行展开堆栈、设置异常对象以及跳转到从相关catch块生成的代码的位置的动作。从根本上说,这与从 C++ 函数调用生成的代码如何知道如何跳转到该函数没有什么不同。编译器将 C++ 翻译成指令以实际执行这些操作。 -
@CharlesBailey:如果将自己置于 C++ 规范的范围内,那么您是对的。尽管实际上除以零是由硬件通过产生无效的操作码异常来处理的,甚至可以在用户级代码中处理。好吧,除了像 FDIV 错误这样的情况..
-
@VladLazarenko:问题标记为
c++,表示行为应根据C++标准定义。
标签: c++ error-handling try-catch