异常处理

硬件中的异常处理

硬件的异常处理机制由CPU 完成。这种机制支持错误检测，在发生错误后会将程序流跳转到专门的错误处理过程（英语：error handling routines）中。发生异常前的状态存储在栈上。

操作系统提供的异常处理设施

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

软件中的异常处理

编程语言的异常处理机制中，异常（英语：exception）这一术语所描述的通常是一种数据结构，这种数据结构可以存储与某种异常情况（英语：exceptional condition）相关的信息。抛（英语：throw）是用来移交控制权的机制，抛出异常也可以称作引发（英语：raise）异常。异常抛出后，控制权会被移交至某处的接（英语：catch）。
从子程序作者的角度看，如果要表示当前子程序无法正常执行，抛出异常是很好的选择。无法正常执行的原因可以是输入参数无效（比如值在函数的定义域之外），也可以是无法获得所需的资源（比如文件不存在、硬盘出错、内存不足）等等。在不支持异常的系统中，子程序需要通过返回特殊的错误码实现类似的功能。然而返回错误码可能导致不完全预测问题，子程序的使用方需要编写额外的代码，才能将普通的返回值与错误码相区别。

程序设计语言的异常机制

许多常见的程序设计语言，包括Actionscript，Ada，BlitzMax，C++，C#，D，ECMAScript，Eiffel，Java，ML，Object Pascal（如Delphi，Free Pascal等），Objective-C，Ocaml，PHP（version 5），PL/1，Prolog，Python，REALbasic，Ruby，Visual Prolog以及大多数.NET程序设计语言，内建的异常机制都是沿着函数调用栈的函数调用逆向搜索，直到遇到异常处理代码为止。一般在这个异常处理代码的搜索过程中逐级完成栈卷回（stack unwinding）。但Common Lisp是个例外，它不采取栈卷回，因此允许异常处理完后在抛出异常的代码处原地恢复执行。而 Visual Basic（尤其是在其早于.net 的版本，例如 6.0 中）走得更远：on error 语句可轻易指定发生异常后是重试（resume）还是跳过（resume next）还是执行程序员定义的错误处理程序（goto ***）。
多数语言的异常机制的语法是类似的：用throw或raise抛出一个异常对象（Java或C++等）或一个特殊可扩展的枚举类型的值（如Ada语言）；异常处理代码的作用范围用标记子句（try或begin开始的语言作用域）标示其起始，以第一个异常处理子句（catch, except, rescue等）标示其结束；可连续出现若干个异常处理子句，每个处理特定类型的异常。某些语言允许else子句，用于无异常出现的情况。更多见的是finally, ensure子句，无论是否出现异常它都将执行，用于释放异常处理所需的一些资源。
C++异常处理是资源获取即初始化（Resource-Acquisition-Is-Initialization）的基础。
C语言一般认为是不支持异常处理的。Perl语言可选择支持结构化异常处理（structured exception handling）。
Python语言对异常处理机制是非常普遍深入的，所以想写出不含try, except的程序非常困难。