異常是程序執(zhí)行過程中產(chǎn)生的問題。C# 異常是對程序運(yùn)行過程中出現(xiàn)的額外情況的一種反饋,例如除數(shù)為零時。
異常提供了一種將控制權(quán)從程序的一個部分轉(zhuǎn)移到另一個部分的方式。C# 異常處理有四個關(guān)鍵詞:try,catch,finally,throw。
假設(shè)一個代碼塊產(chǎn)生了一個異常,通過使用 try 和 catch 的組合可以捕獲這個異常。一個 try/catch 代碼塊需要放置在可能會產(chǎn)生異常的代碼段周圍。try/catch 代碼段就像是保護(hù)代碼,它的使用語法如下:
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
}
當(dāng)你的 try 語句塊可能會拋出多種異常時,你可以列出多種的 catch 語句,以便捕獲不同種類的異常。
C# 異常由類表示。在 C# 中的異常類主要是直接或間接地來源于 System.Exception 類。有些從 System.Exception 類派生的異常類,它們是 System.ApplicationException 和 System.SystemException 類。
System.ApplicationException 類支持由應(yīng)用程序生成的異常。因此,由程序員定義的異常應(yīng)該源于這個類。
System.SystemException 類是所有預(yù)定義的系統(tǒng)異常的基類。
下表提供了一些從 Sytem.SystemException 類派生的預(yù)定義的異常類:
Exception類 | 描述 |
---|---|
System.IO.IOException | 處理 I/O 錯誤 |
System.IndexOutOfRangeException | 處理的方法是指當(dāng)一個數(shù)組索引超出范圍的錯誤產(chǎn)生 |
System.ArrayTypeMismatchException | 處理時,類型不匹配的數(shù)組類型產(chǎn)生的錯誤 |
System.NullReferenceException | 處理從取消引用一個空對象產(chǎn)生的錯誤 |
System.DivideByZeroException | 處理來自將一個除零而產(chǎn)生的錯誤 |
System.InvalidCastException | 處理類型轉(zhuǎn)換過程中產(chǎn)生的錯誤 |
System.OutOfMemoryException | 處理來自可用內(nèi)存不足產(chǎn)生的錯誤 |
System.StackOverflowException | 處理從堆棧溢出產(chǎn)生的錯誤 |
C# 為在 try catch 語句塊中處理異常提供了一種結(jié)構(gòu)化的解決方案。這種方法可以使核心代碼段和異常處理部分分離開。
這些異常處理代碼段是通過使用 try,catch,finally 關(guān)鍵字實現(xiàn)的。下面是一個除數(shù)為零的異常處理情況:
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
{
.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0
你也可以定義你自己的異常。自定義異常類繼承自 ApplicationException 類。示范如下:
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: ApplicationException
{
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);
}
}
}
編譯執(zhí)行上述代碼,得到如下結(jié)果:
TempIsZeroException: Zero Temperature found
如果某個對象是直接或間接地繼承自 System.Exception 類,你可以拋出這個對象。你可以在 catch 語句塊中用 throw 語句拋出這個對象:
Catch(Exception e)
{
...
Throw e
}
更多建議: