【问题标题】:How does an error handler work internally?错误处理程序如何在内部工作?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 听起来不错。但是我也可以在没有“throw”语句的情况下尝试捕获。所以我得到了一个 try catch 和一个失败的操作。操作失败后会发生什么?我是否设置了“失败”位?我是否用信息填充异常对象?似乎我错过了一个非常重要的部分,每个人都认为是不言而喻的?我很欣赏这些链接,现在就给他们看看!
  • 您可以在不使用 throw 的情况下进行 try-catch - 没错。但是为了进入“catch”块,必须抛出异常。使用 try-catch 块包装调用的原因是,您在“try”块中调用的那些函数可以调用“throw”。这么说吧——“throw”要么由你在 try-catch 块中显式调用,要么由你可能从那里调用的某些函数隐式调用。如果操作失败,则永远不会返回。没有设置“失败”位。相反,执行流程被转移到“catch”块(有一些堆栈展开)。像“goto”进入你的“catch”。
  • Lezarenko :非常感谢您的帮助,我认为您的最后一个链接为我提供了足够的信息!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多