當處理錯誤和例外狀況時,可以使用C#中的 try
、catch
、finally
來有效地處理不同類型的異常情況。
try-catch
處理異常:程式語法:
try
{
// 可能引發異常的程式碼
}
catch (ExceptionType1 ex)
{
// 處理 ExceptionType1 類型的異常
}
catch (ExceptionType2 ex)
{
// 處理 ExceptionType2 類型的異常
}
// 可以添加更多的 catch 塊處理不同類型的異常
PS. 從上到下,依照指定的順序檢查 catch
子句。 因此最多只會針對例外狀況執行一個 catch
區塊。
程式範例(處理數學除法中的異常):
class Program
{
static void Main()
{
int dividend = 10;
int divisor = 0;
try
{
int result = dividend / divisor; // 數學除法,會引發 DivideByZeroException
Console.WriteLine("結果:" + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("除以零異常:" + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("其他異常:" + ex.Message);
}
catch (OperationCanceledException)
{
Console.WriteLine("Processing is cancelled.");
}
}
}
在此範例中,我們嘗試將 10 除以 0,這將引發 DivideByZeroException。
我們使用 try-catch
捕捉這個異常並處理它。
PS.
如上述範例所示,您可以省略例外狀況變數的宣告,並指定 catch
子句中的例外狀況類型。
但不含任何指定例外狀況類型的 catch
子句符合任何例外狀況,
如果存在,則必須是最後一個 catch
子句。
try-catch when
處理異常:when
子句,以便根據特定條件捕捉異常。程式語法:
try
{
// 可能引發異常的程式碼
}
catch (ExceptionType ex) when (condition)
{
// 當滿足條件時處理異常
}
程式範例(處理索引範圍的異常):
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5 };
int index = 10;
try
{
int value = numbers[index];
Console.WriteLine("取得數字:" + value);
}
catch (IndexOutOfRangeException ex) when (index < 0 || index >= numbers.Length)
{
Console.WriteLine("索引超出範圍:" + ex.Message);
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("一般索引超出範圍:" + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("其他異常:" + ex.Message);
}
}
}
在這個範例中,我們嘗試獲取數組中索引為 10 的數字,這將引發 IndexOutOfRangeException
。但是,我們使用了 try-catch when
,在第一個 catch
中,我們僅在索引小於 0 或大於等於數組長度時處理該異常。如果索引在其他範圍內,將執行第二個 catch
。
我們能夠根據特定條件更細致地處理不同情況下的異常。
finally
:程式語法:
try
{
// 可能引發異常的程式碼
}
catch (Exception ex)
{
// 處理異常
}
finally
{
// 無論是否發生異常,都會執行的程式碼
}
程式範例(使用 finally
清理資源):
class Program
{
static void Main()
{
FileStream file = null;
try
{
file = new FileStream("sample.txt", FileMode.Open);
// 使用文件
}
catch (FileNotFoundException ex)
{
Console.WriteLine("文件未找到:" + ex.Message);
}
finally
{
// 確保關閉文件,無論是否發生異常
if (file != null)
{
file.Close();
}
}
}
}
在此範例中,我們打開一個文件來進行讀取操作,然後使用 finally
確保無論是否發生異常,都會關閉文件。
使用 throw
陳述句引發自定義異常:
可以使用 throw
陳述句來引發自定義異常,以便在特定情況下通知程式的使用者。
程式範例:
try
{
// 可能引發異常的程式碼
if (someCondition)
{
throw new CustomException("自定義異常消息");
}
}
catch (CustomException ex)
{
Console.WriteLine("自定義異常:" + ex.Message);
}
例外狀況| 條件
------------- | -------------
ArgumentException | 傳遞至方法的非 Null 引數無效。
ArgumentNullException | 傳遞至方法的引數為 null 。
ArgumentOutOfRangeException | 引數超出有效值的範圍。
DirectoryNotFoundException | 目錄路徑的一部分無效。
DivideByZeroException | 整數或 Decimal 除法運算中的分母為零。
DriveNotFoundException | 磁片磁碟機無法使用或不存在。
FileNotFoundException | 檔案不存在。
FormatException | 值不是適當的格式,無法透過轉換方法從字串轉換,例如 Parse 。
IndexOutOfRangeException | 索引超出陣列或集合的界限。
InvalidOperationException | 方法呼叫在物件的目前狀態中無效。
KeyNotFoundException | 找不到存取集合中成員的指定索引鍵。
NotImplementedException | 未實作方法或作業。
NotSupportedException | 不支援方法或作業。
ObjectDisposedException | 作業會在已處置的物件上執行。
OverflowException | 算術、轉型或轉換運算會導致溢位。
PathTooLongException | 路徑或檔案名超過系統定義的長度上限。
PlatformNotSupportedException | 目前平臺不支援此作業。
RankException | 維度數目錯誤的陣列會傳遞至 方法。
TimeoutException | 配置給作業的時間間隔已過期。
UriFormatException | 使用不正確統一資源識別項 (URI) 。
期望挑戰30天持續更新成功 ~ DAY11