C#異常處理
異常(例外)是在執行程序期間出現的問題。 C# 異常是對程序運行時出現的異常情況的響應,例如:除以零的算術運算。
異常提供了將控制從程序的一個部分轉移到另一個程序的方法。 C# 異常處理建立在四個關鍵字上:try
,catch
,finally
和throw
。
- try:
try
塊標識一個特定異常被激活的代碼塊。try
塊之後有一個或多個catch
塊。 - catch:程序在處理問題的程序中的某個位置使用異常處理程序捕獲異常。
catch
關鍵字表示捕獲異常。 - finally:
finally
塊用於執行給定的一組語句,無論拋出異常還是拋出異常。例如,如果打開文件,則不管是否引發異常,都必須關閉該文件。 - throw:當出現問題時,程序會拋出異常。這是使用
throw
關鍵字完成的。
語法
假設一個塊引發異常,一個方法使用try
和catch
關鍵字的組合來捕獲異常。try/catch
塊放在可能會產生異常的代碼周圍。try/catch
塊中的代碼被稱爲受保護代碼,並且使用try/catch
的語法如下所示:
try
{
// statements causing exception
}catch( ExceptionName e1 ){
// error handling code
}catch( ExceptionName e2 ){
// error handling code
}catch( ExceptionName eN ){
// error handling code
}finally{
// statements to be executed
}
可以列出多個catch
語句來捕獲不同類型的異常,以防try
塊在不同情況(case
)下引發多個異常。
C# 異常類
C# 異常由類表示。 C# 中的異常類主要直接或間接地從System.Exception
類派生。 從System.Exception
類派生的一些異常類是System.ApplicationException
和System.SystemException
類。
System.ApplicationException
類支持應用程序生成的異常。因此,程序員定義的異常應該從這個類派生出來。
System.SystemException
類是所有預定義系統異常的基類。
下表列出了一些從System.SystemException
類派生的一些預定義的異常類:
異常類
描述
System.IO.IOException
處理I/O
錯誤
System.IndexOutOfRangeException
處理當方法引用數組索引超出範圍時生成的錯誤。
System.ArrayTypeMismatchException
處理類型與數組類型不匹配時生成的錯誤。
System.NullReferenceException
處理從引用空(null
)對象而產生的錯誤。
System.DivideByZeroException
處理除以零產生的錯誤。
System.InvalidCastException
處理類型轉換過程中產生的錯誤。
System.OutOfMemoryException
處理由於空閒內存不足而產生的錯誤。
System.StackOverflowException
處理由於空閒內存不足而產生的錯誤。
System.StackOverflowException
處理堆棧溢出產生的錯誤。
處理異常
C# 以try
和catch
塊的形式提供了異常處理的結構化解決方案。使用這些塊,核心程序語句與錯誤處理語句分離。
這些錯誤處理塊使用try
,catch
和finally
關鍵字實現。下面是一個除以零條件發生異常時的異常:
using System;
namespace ErrorHandlingApplication
{
class DivNumbers
{
int result;
DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Exception caught: {0}", e);
}
finally
{
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
當上述代碼被編譯並執行時,它產生以下結果:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0
用戶定義的異常
您也可以定義自己的異常。用戶定義的異常類派生自Exception
類。以下示例演示如何創建一個自定義異常:
using System;
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
temp.showTemp();
}
catch(TempIsZeroException e)
{
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: Exception
{
public TempIsZeroException(string message): base(message)
{
}
}
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if(temperature == 0)
{
throw (new TempIsZeroException("Zero Temperature found"));
}
else
{
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
當上述代碼被編譯並執行時,它產生以下結果:
TempIsZeroException: Zero Temperature found
拋出對象
如果直接或間接派生自System.Exception
類,則可以拋出一個對象。可以在catch
塊中使用throw
語句將當前對象拋出:
Catch(Exception e)
{
...
Throw e
}