首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >异常是如何在幕后实现的?

异常是如何在幕后实现的?
EN

Stack Overflow用户
提问于 2010-01-04 02:06:17
回答 5查看 9.2K关注 0票数 69

几乎每个人都在使用它们,但包括我在内的许多人只是想当然地认为它们只是工作而已。

我在找高质量的材料。我使用的语言有: Java,C,C#,Python,C++,所以这些都是我最感兴趣的。

现在,C++可能是一个很好的起点,因为您可以使用该语言抛出任何东西。

而且,C语言也很接近汇编。如何使用纯C构造而不使用程序集来模拟异常?

最后,我听到一个谣言,谷歌员工出于速度考虑,在一些项目中不使用异常。这只是个谣言吗?没有它们,任何实质性的事情怎么能完成呢?

谢谢。

EN

回答 5

Stack Overflow用户

发布于 2010-01-04 02:18:45

下面是实现C++异常的一种常见方式:

http://www.codesourcery.com/public/cxx-abi/abi-eh.html

它适用于Itanium体系结构,但此处描述的实现也可用于其他体系结构。请注意,这是一个很长的文档,因为C++异常很复杂。

下面是LLVM如何实现异常的一个很好的描述:

http://llvm.org/docs/ExceptionHandling.html

由于LLVM旨在成为许多运行时的公共中间表示,因此所描述的机制可以应用于许多语言。

票数 24
EN

Stack Overflow用户

发布于 2010-01-04 02:14:19

C/C++编译器使用底层操作系统工具进行异常处理。在VM中,像.Net或Java这样的框架也依赖于OS工具。例如,在Windows中,真正繁重的任务是由结构化异常处理基础设施SEH完成的。您绝对应该阅读旧的参考文章:A Crash Course on the Depths of Win32™ Structured Exception Handling

至于不使用异常的成本,它们是昂贵的,但与什么相比呢?与返回错误代码相比?在考虑到正确性和代码质量的成本之后,对于商业应用程序来说,异常总是会获胜。由于缺少几个非常关键的OS级函数,异常在总体上总是更好的。

最后但并非最不重要的一点是,使用异常进行流控制的反模式。异常应该是异常的,滥用异常进行流控制的代码将在性能上付出代价。

票数 7
EN

Stack Overflow用户

发布于 2010-01-04 02:08:45

通常是setjmp()longjmp()

异常捕获确实有不小的成本,但对于大多数目的来说,这并不是什么大问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1995734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档