异常处理
在计算和计算机编程领域中,例外處理(英語:exception handling,也意译为異常处理),指的是在程序执行期间,对出现的例外或異常情况的响应处理機制。一般而言,例外打断正常的执行流程并执行预先登记的“例外处理器”,具体處理措施依赖于它是硬件还是软件例外,还有软件例外是如何实现的。
例外是由计算机系统的不同层级来定义的,典型的层级有CPU定义的中断、操作系统(OS)定义的信号和编程语言定义的例外。每个层级都要求不同例外处理方式,但是它们可以是关联的,比如说CPU中断可能被转变成OS信号。一些例外(特别是硬件例外)可以被优雅地处理,使得程序执行能在它被中断的地方恢复。
硬體的例外处理
[编辑]硬體的例外处理机制由CPU完成。这种机制支持错误检测,在发生错误后会将程序流跳转到专门的错误处理例程中。发生例外前的状态存储在栈上。[1]
操作系统的例外处理
[编辑]针对程序中可能发生的例外,操作系统可能通过IPC来提供对应的处理设施。进程执行过程中发生的中断通常由操作提供的「中断服务子程序」处理,操作系统可以藉此向该进程发送信号。进程可以通过注册信号处理器的方式自行处理信号,也可以让操作系统执行預設行为(比如终止该程序)。
从进程的视角,硬體中断相当于可恢复例外,虽然中断一般与程序流本身无关。
编程语言的例外处理
[编辑]在编程语言领域,通常例外(英語:exception)这一术语所描述的是一种資料结构,该資料结构可以存储例外的相关訊息。例外处理的常见的一种机制是移交控制权。引发(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值判断是否执行失败,但有时候也会通过异常处理判断是否执行失败。
引用
[编辑]- ^ Hardware Exceptions Detection. TEXAS INSTRUMENTS. 2011-11-24 [2012-10-05]. (原始内容存档于2013-11-10) (英语).
外部链接
[编辑]- A Crash Course on the Depths of Win32 Structured Exception Handling by Matt Pietrek - Microsoft Systems Journal (1997)
- Conference slides Floating-Point Exception-Handling policies (pdf p. 46) (页面存档备份,存于互联网档案馆) by William Kahan