**例外處理**（粵拼：lai6 oi6 cyu5 lei5；英文：**exception handling**）喺控制流程上係指對異常個案嘅處理。廿一世紀嘅程式語言多數都會有一啲特定嘅機制俾用家做例外處理－包括喺行一個迴圈，撞到一個異常情況嗰陣，叫個程式去行第段（迴圈以外嘅）碼再返去個迴圈嗰度。

概論
--

睇埋：控制流程
例如 C++ 就有噉嘅功能：

```
#include <iostream> 
using namespace std; 
 
int main() 
{ 
 int x = -1; // 設 x 做 -1

 cout << "Before try \n"; 
 try { 
 cout << "Inside try \n"; 
 if (x < 0) // 如果 x 細過 0
 { 
 throw x; // 「掟」x
 cout << "After throw (Never executed) \n"; 
 } 
 } 
 catch (int x ) { // 掟咗 x 一個整數（int；integer）出去嘅話就要行呢段碼
 cout << "Exception Caught \n"; 
 } 
 
 cout << "After catch (Will be executed) \n"; 
 return 0; 
}

```

呢段碼會俾噉嘅輸出：

```
Before try
Inside try
Exception Caught
After catch (Will be executed)

```

以上呢個例子用咗 `throw` 一個整數 `x`，但 `catch` 可以配合任何數量或者類型嘅變數使用，例如 `throw` 兩個整數變數，又或者 `throw` 三個 `float` 類型嘅變數呀噉。如果冇任何一個 `catch` 吻合掟咗出去嗰個或柞變數，個程式通常會去個 `try` 以外搵相應嘅 `catch`（呢點視乎程式語言可能有異），如果搵唔到就會向用家顯示一個「出錯」嘅訊息。

第啲程式語言當中都有啲類似嘅功能：受到 C++ 影響，有多款程式語言都會用 `catch` 呢個字做同樣嘅功能，例子有 Java 同 C#；另一方面，又有啲語言（例如 Ada）興用 `exception` 呢個關鍵字嚟做例外處理同用第啲關鍵字做 `catch` 嘅功能。好似係以下呢段用 AppleScript 寫成嘅碼噉：

```
try
    set myNumber to myNumber / 0
on error e  number n  from f  to t  partial result pr
    if ( e = "Can't divide by zero" ) then display dialog "You must not do that"
end try

```

finally
-------

某啲程式語言當中有 `finally` 嘅功能，配合 `try` 嚟使用。無論個程式點樣離開個 `try`，`finally` 掕嗰柞碼都會被執行。喺實際編程上，呢種功能可以要嚟確保個程式喺行完個 `try` 之後實會關某個檔案或者同數據庫斷線（喺某啲情況下可以慳好多資源）。包括 Java、C#、同 Python 等都具有呢種功能，例如以下呢段 C# 碼：

```
FileStream stm = null;
try {
 stm = new FileStream ("logfile.txt", FileMode.Create);
 return ProcessStuff(stm); // may throw an exception
} finally {
 if (stm != null)
 stm.Close(); // finally 跟嗰柞碼實會行－無論個程式係以乜方法離開個 try
}

```

而因為「想喺做完個迴圈之後關咗個檔案佢」好普遍，有啲程式語言甚至索性有功能做呢樣嘢。例如係 C# 噉：

```
using (FileStream stm = new FileStream ("logfile.txt", FileMode.Create)) {
 return ProcessStuff(stm); // may throw an exception
}

```

C# 程式語言內置咗，當個程式離開 `using` 嗰陣，個編譯器會確保啲記憶體會釋放 `stm` 呢舊嘢（`stm` 係一個檔案等），即係教部電腦暫時將個檔案開咗佢，用完就將佢由記憶體嗰度釋放。Python 嘅 `with` 以及 Ruby 嘅 `File.open` 都會達到類似嘅效果。

睇埋
--

* 冗餘
* 容錯性

攷
-

1. 1 2 3  Exception Handling in C++ 互聯網檔案館嘅歸檔，歸檔日期2017年11月21號，..
2. ↑  Liskov, B. H. & Snyder, A. (1979). Exception handling in CLU. *IEEE transactions on software engineering*, (6), 546-558.
3. ↑  Goodman, D. (1994). *Danny Goodman's AppleScript Handbook*. Alfred A. Knopf, Inc..
4. ↑  try-finally (C# Reference) 互聯網檔案館嘅歸檔，歸檔日期2019年7月13號，..
5. ↑  Understanding Python's "with" statement 互聯網檔案館嘅歸檔，歸檔日期2019年3月5號，..

| * 睇
* 傾
* 改
電腦程式編寫（大綱） |
| --- |
| 編寫電腦程式嘅工作 |
| 基本概念 | 

|  |
| --- |
| 電腦程式（哈佬呀世界 · 應用程式） · 演算法 · 命令 · 資料類型（原始資料類型） · 數據結構 |
| 程式執行 | 執行檔 · 執行期 · 虛擬機 · Logging |

 |  |
| 郁手寫碼 | 

|  |  |
| --- | --- |
| 　原始碼 | 編輯器 · 碼塊 · 縮排同越位法則 · 改名習慣 · 可讀度 · 麵條式程式碼 |
| 虛擬碼 · 函式庫（標準庫） · 風格 · 代碼重構 · Bug · Debug（除錯器） · 寫程式工具 · 編程員 |

 |
| 翻譯 | 

|  |  |
| --- | --- |
| 　編譯器 | 目的碼 · 位元組碼 · 機械碼 · 編譯期 · 即時編譯、提前編譯同動態重編譯 · 反編譯器 |
| 中間表示 · 源碼到源碼翻譯器 · 最佳化編譯器 |

 |
| 程式語言（理論） | 

|  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |
| --- | --- |
| 相關概念 | 陳述式 · 句法同語義 · 算子 · 注釋 · 指標 · 低級語言（機械 · 組合語言） · 手稿語言 |
| 高級語言 | C、C++ 同 C♯ · Python · PHP · Java · JavaScript · Julia · MATLAB |
| 變數 | 局部同全局 · 參數 · 常數 · 命名空間 · 初始化同最終化 |
| 控制流程 | 

|  |
| --- |
| Goto · 子程式（遞歸） · 條件同開閂 · 例外處理 · 協程（子程式） |
| 迴圈 | For · While · Do-while · Foreach · 變量同不變量 · 無限 |

 |

 |

 |
| 編程範式 | 宣告式（函數 · 邏輯 · 約束 · 數據流） · 指令式（程序式 · 物件導向式） · 結構化 · 事件驅動式 |
| 相關領域 | 

|  |  |
| --- | --- |
| 電腦科學 | 理論電腦科學（運算理論） · 軟件工程 · 遊戲編程 · 人工智能 |
| 拉雜領域 | 邏輯學 · 數學（應用同離散數學） · 認知科學（語言學） · 數碼藝術同演算法藝術 |

 |
| 編程遊戲 · 編程類 |