異常(例外)是在執(zhí)行程序期間出現(xiàn)的問(wèn)題。 C# 異常是對(duì)程序運(yùn)行時(shí)出現(xiàn)的異常情況的響應(yīng),例如:除以零的算術(shù)運(yùn)算。
異常提供了將控制從程序的一個(gè)部分轉(zhuǎn)移到另一個(gè)程序的方法。 C# 異常處理建立在四個(gè)關(guān)鍵字上:try,catch,finally和throw。
try塊標(biāo)識(shí)一個(gè)特定異常被激活的代碼塊。try塊之后有一個(gè)或多個(gè)catch塊。catch關(guān)鍵字表示捕獲異常。finally塊用于執(zhí)行給定的一組語(yǔ)句,無(wú)論拋出異常還是拋出異常。例如,如果打開(kāi)文件,則不管是否引發(fā)異常,都必須關(guān)閉該文件。throw關(guān)鍵字完成的。假設(shè)一個(gè)塊引發(fā)異常,一個(gè)方法使用try和catch關(guān)鍵字的組合來(lái)捕獲異常。try/catch塊放在可能會(huì)產(chǎn)生異常的代碼周圍。try/catch塊中的代碼被稱為受保護(hù)代碼,并且使用try/catch的語(yǔ)法如下所示:
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
}
可以列出多個(gè)catch語(yǔ)句來(lái)捕獲不同類型的異常,以防try塊在不同情況(case)下引發(fā)多個(gè)異常。
C# 異常由類表示。 C# 中的異常類主要直接或間接地從System.Exception類派生。 從System.Exception類派生的一些異常類是System.ApplicationException和System.SystemException類。
System.ApplicationException類支持應(yīng)用程序生成的異常。因此,程序員定義的異常應(yīng)該從這個(gè)類派生出來(lái)。
System.SystemException類是所有預(yù)定義系統(tǒng)異常的基類。
下表列出了一些從System.SystemException類派生的一些預(yù)定義的異常類:
| 異常類 | 描述 |
|---|---|
| System.IO.IOException | 處理I/O錯(cuò)誤 |
| System.IndexOutOfRangeException | 處理當(dāng)方法引用數(shù)組索引超出范圍時(shí)生成的錯(cuò)誤。 |
| System.ArrayTypeMismatchException | 處理類型與數(shù)組類型不匹配時(shí)生成的錯(cuò)誤。 |
| System.NullReferenceException | 處理從引用空(null)對(duì)象而產(chǎn)生的錯(cuò)誤。 |
| System.DivideByZeroException | 處理除以零產(chǎn)生的錯(cuò)誤。 |
| System.InvalidCastException | 處理類型轉(zhuǎn)換過(guò)程中產(chǎn)生的錯(cuò)誤。 |
| System.OutOfMemoryException | 處理由于空閑內(nèi)存不足而產(chǎn)生的錯(cuò)誤。 |
| System.StackOverflowException | 處理由于空閑內(nèi)存不足而產(chǎn)生的錯(cuò)誤。 |
| System.StackOverflowException | 處理堆棧溢出產(chǎn)生的錯(cuò)誤。 |
C# 以try和catch塊的形式提供了異常處理的結(jié)構(gòu)化解決方案。使用這些塊,核心程序語(yǔ)句與錯(cuò)誤處理語(yǔ)句分離。
這些錯(cuò)誤處理塊使用try,catch和finally關(guān)鍵字實(shí)現(xiàn)。下面是一個(gè)除以零條件發(fā)生異常時(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
{
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
當(dāng)上述代碼被編譯并執(zhí)行時(shí),它產(chǎn)生以下結(jié)果:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0
您也可以定義自己的異常。用戶定義的異常類派生自Exception類。以下示例演示如何創(chuàng)建一個(gè)自定義異常:
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);
}
}
}
當(dāng)上述代碼被編譯并執(zhí)行時(shí),它產(chǎn)生以下結(jié)果:
TempIsZeroException: Zero Temperature found
如果直接或間接派生自System.Exception類,則可以拋出一個(gè)對(duì)象??梢栽?code>catch塊中使用throw語(yǔ)句將當(dāng)前對(duì)象拋出:
Catch(Exception e)
{
...
Throw e
}