异常处理的本质:状态回滚或者状态维护。

https://en.wikipedia.org/wiki/Exception_handling

In general, an exception breaks the normal flow of execution and executes a pre-registered exception handler. The details of how this is done depends on whether it is a hardware or software exception and how the software exception is implemented. Some exceptions, especially hardware ones, may be handled so gracefully that execution can resume where it was interrupted.

Exception handling implementation[edit]

The implementation of exception handling in programming languages typically involves a fair amount of support from both a code generator and the runtime system accompanying a compiler. (It was the addition of exception handling to C++ that ended the useful lifetime of the original C++ compiler, Cfront.[21]) Two schemes are most common. The first, dynamic registration, generates code that continually updates structures about the program state in terms of exception handling.[22] Typically, this adds a new element to the stack frame layoutthat knows what handlers are available for the function or method associated with that frame; if an exception is thrown, a pointer in the layout directs the runtime to the appropriate handler code. This approach is compact in terms of space, but adds execution overhead on frame entry and exit. It was commonly used in many Ada implementations, for example, where complex generation and runtime support was already needed for many other language features. Dynamic registration, being fairly straightforward to define, is amenable to proof of correctness.[23]

The second scheme, and the one implemented in many production-quality C++ compilers, is a table-driven approach. This creates static tables at compile time and link time that relate ranges of the program counter to the program state with respect to exception handling.[24] Then, if an exception is thrown, the runtime system looks up the current instruction location in the tables and determines what handlers are in play and what needs to be done. This approach minimizes executive overhead for the case where an exception is not thrown. This happens at the cost of some space, but this space can be allocated into read-only, special-purpose data sections that are not loaded or relocated until an exception is actually thrown.[25] This second approach is also superior in terms of achieving thread safety[citation needed].

Other definitional and implementation schemes have been proposed as well.[26] For languages that support metaprogramming, approaches that involve no overhead at all have been advanced.[27]

Uncaught exceptions[edit]

If an exception is thrown and not caught (operationally, an exception is thrown when there is no applicable handler specified), the uncaught exception is handled by the runtime; the routine that does this is called the uncaught exception handler.[28][29] The most common default behavior is to terminate the program and print an error message to the console, usually including debug information such as a string representation of the exception and the stack trace.[28][30][31] This is often avoided by having a top-level (application-level) handler (for example in an event loop) that catches exceptions before they reach the runtime.[28][32]

Note that even though an uncaught exception may result in the program terminating abnormally (the program may not be correct if an exception is not caught, notably by not rolling back partially completed transactions, or not releasing resources), the process terminates normally (assuming the runtime works correctly), as the runtime (which is controlling execution of the program) can ensure orderly shutdown of the process.

In a multithreaded program, an uncaught exception in a thread may instead result in termination of just that thread, not the entire process (uncaught exceptions in the thread-level handler are caught by the top-level handler). This is particularly important for servers, where for example a servlet (running in its own thread) can be terminated without the server overall being affected.

This default uncaught exception handler may be overridden, either globally or per-thread, for example to provide alternative logging or end-user reporting of uncaught exceptions, or to restart threads that terminate due to an uncaught exception. For example, in Java this is done for a single thread via Thread.setUncaughtExceptionHandler and globally via Thread.setDefaultUncaughtExceptionHandler; in Python this is done by modifying sys.excepthook.

Exception support in programming languages[edit]

Many computer languages have built-in support for exceptions and exception handling. This includes ActionScriptAdaBlitzMaxC++C#COBOLDECMAScriptEiffelJavaMLObject Pascal (e.g. DelphiFree Pascal, and the like), PowerBuilderObjective-COCamlPHP (as of version 5), PL/1PL/SQLPrologPythonREALbasicRubyScalaSeed7TclVisual Prolog and most .NET languages. Exception handling is commonly not resumable in those languages, and when an exception is thrown, the program searches back through the stack of function calls until an exception handler is found.

Some languages call for unwinding the stack as this search progresses. That is, if function f, containing a handler H for exception E, calls function g, which in turn calls function h, and an exception E occurs in h, then functions h and g may be terminated, and H in f will handle E.

最新文章

  1. Linux定时,计划任务cron
  2. PHP学习之一晚撸下W3chscool
  3. iOS开发-控件设置
  4. Spring - Sring MVC入门
  5. yii2源码学习笔记
  6. WordPress网站更换老鹰主机详细操作
  7. sql2005,sql2008,sql2012清空日志语句
  8. css float 布局
  9. Git学习之路(5)- 同步到远程仓库及多人协作问题
  10. jstack jstat 简易使用教程
  11. java String,StringBuffer和StringBulder学习笔记
  12. Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
  13. SQL Server移除事务日志后sys.master_files依然存在记录问题
  14. 20145338 《网络对抗》 MSF基础应用
  15. 1226 快速幂 取余运算 洛谷luogu
  16. doubleclick protobuf file load to project
  17. 152. Maximum Product Subarray (Array; DP)
  18. Hive为什么要分桶
  19. C#操作VFP的dbf数据库文件实例
  20. java对象在JVM堆中的数据结构

热门文章

  1. django的models字段介绍
  2. [USACO14MAR]破坏Sabotage 二分答案
  3. CF E .Tree with Small Distances(树上的贪心)
  4. 非关系型数据库---Memcached
  5. 028 Implement strStr() 实现 strStr()
  6. eslint规则 中文备注
  7. Java ping 主机 端口
  8. [LeetCode]7. Reverse Integer整数反转
  9. Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n
  10. HTML5&CSS挑战