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

C++ 错误处理程序如何在内部工作?,c++,error-handling,try-catch,C++,Error Handling,Try Catch,我知道互联网上有很多关于这个话题的文档。 但是在没有正确答案的情况下进行数小时的研究是相当令人沮丧的。所以我想我不能用一个好的短语来表达我的问题。以下是完整版本: 我正在做一个关于试捕的演示,但是做基本的事情很无聊。我知道什么是try-catch,我知道它是如何工作的。 但是魔术来了:假设我们使用C++。 编译器将在堆上创建一个只读列表,其中的结构提供有关try块中函数的信息。这包括例程开始和结束的指针、有关异常对象类型的信息等等。(如果我错了,请纠正我) 好的。现在出现了一个异常。所谓的错误处

我知道互联网上有很多关于这个话题的文档。 但是在没有正确答案的情况下进行数小时的研究是相当令人沮丧的。所以我想我不能用一个好的短语来表达我的问题。以下是完整版本:

我正在做一个关于试捕的演示,但是做基本的事情很无聊。我知道什么是try-catch,我知道它是如何工作的。 但是魔术来了:假设我们使用C++。 编译器将在堆上创建一个只读列表,其中的结构提供有关try块中函数的信息。这包括例程开始和结束的指针、有关异常对象类型的信息等等。(如果我错了,请纠正我)

好的。现在出现了一个异常。所谓的错误处理程序(在这里,谁是错误处理程序?)。通过将错误生成的异常对象与捕获中的异常对象进行比较,可以找到正确的捕获

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


但是:程序如何注意到存在异常?这是由程序、运行时还是处理器(我读到关于RIG0和RIG1的不同,CPU OO中的不同级别)处理的。

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

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

尽管这些异常在C++中大量使用,它提供了一个很好的接口来“抛出”和“捕获”它们,它们也在C语言中使用,甚至在Linux内核中使用。p> 您可以在此处阅读更多内容:


听起来像是读过OS异常,以及C++异常,并把它们读为相同的。他们不是。C++异常与CPU无关,与任何其他语言构造无关。如果你想对异常实现进行合理化,你必须指定一个特定的工具链。好的,我对C++异常感兴趣。但我无法想象错误处理将如何工作。我的意思是-我的程序怎么能注意到有异常?我需要操作系统吗?或者我不需要这些吗?你说的“注意”是什么意思?当出现异常时,它会“注意”到,就像它在调用函数或设置变量时“注意”到一样;这是程序设定的。从C++代码>中生成的机器代码尝试语句执行展开堆栈、设置异常对象、跳转到相关代码< catch catch >代码>块的代码位置的动作。从根本上来说,这与从C++函数调用生成的代码知道如何跳转到该函数没有区别。编译器将C++翻译成指令来实际完成这些操作。@ CharlesBailey:如果把自己放在C++规范的限制范围内,那你就对了。虽然在实践中,零除法是由硬件通过生成无效操作码异常来处理的,甚至可以在用户级代码中处理。除了FFDI bug以外的例子…@ VladLazarenko:问题是标签<代码> C++ >代码>,这意味着行为应该按照C++标准来定义。听起来很不错。但我也能在没有“抛出”语句的情况下尝试接球。所以我得到了一个尝试捕捉和一个失败的操作。操作失败后会发生什么?我是否设置了“失败”位?我是否用信息填充异常对象?似乎我遗漏了一个大家都认为不言而喻的重要部分?我很感激这些链接,现在就来看看吧!你可以做一个不丢球的试接球-没错。但为了进入“catch”块,某些东西必须抛出异常。使用try-catch块包装调用的原因是,在“try”块内调用的那些函数可以调用“throw”。换句话说,“throw”要么由您在try-catch块中显式调用,要么由您可能从那里调用的某些函数隐式调用。如果操作失败,它将永远不会返回。未设置“失败”位。相反,执行流被传输到“catch”块(使用一些堆栈展开)。就像你的“捕获”中的“goto”一样。请特别注意-Lezarenko:我非常感谢你的帮助,我认为你的最后一个链接为我提供了足够的信息!谢谢