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

概論 編輯

睇埋:控制流程

例如 C++ 就有噉嘅功能[1]

#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; 
}

呢段碼會俾噉嘅輸出[1]

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

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

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

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 嚟使用。無論個程式點樣離開個 tryfinally 掕嗰柞碼都會被執行。喺實際編程上,呢種功能可以要嚟確保個程式喺行完個 try 之後實會關某個檔案或者同數據庫斷線(喺某啲情況下可以慳好多資源)。包括 Java、C#、同 Python 等都具有呢種功能,例如以下呢段 C# 碼[4]

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 都會達到類似嘅效果[5]

睇埋 編輯

引咗 編輯

  1. 1.0 1.1 1.2 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號,..