鍍金池/ 教程/ C#/ 異常處理
循環(huán)
正則表達(dá)式
概述
委托
多態(tài)性
字符串
繼承
結(jié)構(gòu)體
集合
變量
不安全代碼
判斷
反射
異常處理
可空類型
方法
數(shù)據(jù)類型
命名空間
文件 I/O
類型轉(zhuǎn)換
屬性
程序結(jié)構(gòu)
事件
接口
預(yù)處理指令
運算符
多線程
匿名方法
索引器
泛型
封裝
常量和文字
基本語法
特性
數(shù)組
環(huán)境配置
運算符重載
枚舉

異常處理

異常是程序執(zhí)行過程中產(chǎn)生的問題。C# 異常是對程序運行過程中出現(xiàn)的額外情況的一種反饋,例如除數(shù)為零時。

異常提供了一種將控制權(quán)從程序的一個部分轉(zhuǎn)移到另一個部分的方式。C# 異常處理有四個關(guān)鍵詞:try,catch,finallythrow。

  • try:try 塊標(biāo)識代碼塊的哪些特定的異常將被激活。它的后面是一個或多個 catch 塊。
  • catch:一個用于捕獲異常的程序段,將 catch 放在你希望能處理這個異常的地方?!癱atch”這個關(guān)鍵字標(biāo)志著異常的捕獲。
  • finally:finally 保證了無論是否有異常拋出,此代碼段中的程序都會被執(zhí)行。例如,如果你打開了一個文件,那么不管是否發(fā)生了異常,文件都需要關(guān)閉。
  • throw:當(dāng)出現(xiàn)問題時,程序會拋出異常。這項工作是通過使用 throw 來實現(xiàn)的。

語法

假設(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# 異常由類表示。在 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

創(chuàng)建自定義異常

你也可以定義你自己的異常。自定義異常類繼承自 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
    }
上一篇:泛型下一篇:結(jié)構(gòu)體