异常处理

在计算和计算机编程领域中，-{例外}-處理（，也意译为異常处理），指的是在程序期间，对出现的-{例外}-或異常情况的响应处理機制。一般而言，例外打断正常的执行流程并执行预先登记的“例外处理器”，具体處理措施依赖于它是硬件还是软件例外，还有软件例外是如何实现的。

例外是由计算机系统的不同层级来定义的，典型的层级有CPU定义的中断、操作系统（OS）定义的信号和编程语言定义的例外。每个层级都要求不同例外处理方式，但是它们可以是关联的，比如说CPU中断可能被转变成OS信号。一些例外（特别是硬件例外）可以被优雅地处理，使得程序执行能在它被中断的地方恢复。

 硬體的例外处理 

硬體的例外处理机制由CPU完成。这种机制支持错误检测，在发生错误后会将程序流跳转到专门的错误处理例程中。发生例外前的状态存储在栈上。

 操作系统的例外处理 

针对程序中可能发生的例外，操作系统可能通过IPC来提供对应的处理设施。进程执行过程中发生的中断通常由操作提供的「中断服务子程序」处理，操作系统可以藉此向该进程发送信号。进程可以通过注册信号处理器的方式自行处理信号，也可以让操作系统执行預設行为（比如终止该程序）。

从进程的视角，硬體中断相当于可恢复例外，虽然中断一般与程序流本身无关。

编程语言的例外处理

在编程语言领域，通常例外（）这一术语所描述的是一种資料结构，该資料结构可以存储例外的相关訊息。例外处理的常见的一种机制是移交控制权。引发（raise）例外，也叫作抛出（throw）例外，通过该方式达到移交控制权的效果。例外抛出后，控制权会被移交至某处的接住（catch），并执行处理。

 编程语言的错误处理 
错误处理（error handling）是通过处理函数的返回值的形式从而处理错误的一种编程方式。在Go等返回值可为复数的语言中，可通过将其中一个值设为错误值，从而达到错误处理的效果。
f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
// do something with the open *File f

在仅仅支持返回状态码的语言里，可通过处理错误码，达到错误处理的效果。shell语言可通过$?获得函数执行的退出码，从而判断是否出错。

在其他语言中，可以通过判断结果的某一个特征，从而达到错误处理部分的效果，但不意味着这些语言自身支持错误处理。如，Java等面向对象的语言往往会通过null值判断是否执行失败，但有时候也会通过异常处理判断是否执行失败。

引用

外部链接
 A Crash Course on the Depths of Win32 Structured Exception Handling by  - Microsoft Systems Journal (1997)
 Conference slides Floating-Point Exception-Handling policies (pdf p. 46)   by William Kahan

Category:控制流程
Category:软件异常