例外處理
例外處理(粵拼:lai6 oi6 cyu5 lei5;英文:exception handling)喺控制流程上係指對異常個案嘅處理。廿一世紀嘅程式語言多數都會有一啲特定嘅機制俾用家做例外處理-包括喺行一個迴圈,撞到一個異常情況嗰陣,叫個程式去行第段(迴圈以外嘅)碼再返去個迴圈嗰度。
概論
[編輯]#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
嚟使用。無論個程式點樣離開個 try
,finally
掕嗰柞碼都會被執行。喺實際編程上,呢種功能可以要嚟確保個程式喺行完個 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.0 1.1 1.2 Exception Handling in C++ 互聯網檔案館嘅歸檔,歸檔日期2017年11月21號,..
- ↑ Liskov, B. H., & Snyder, A. (1979). Exception handling in CLU. IEEE transactions on software engineering, (6), 546-558.
- ↑ Goodman, D. (1994). Danny Goodman's AppleScript Handbook. Alfred A. Knopf, Inc..
- ↑ try-finally (C# Reference) 互聯網檔案館嘅歸檔,歸檔日期2019年7月13號,..
- ↑ Understanding Python's "with" statement 互聯網檔案館嘅歸檔,歸檔日期2019年3月5號,..