簡單介紹一下C# exception的用法及基本觀念

為什麼要用try catch來補抓exception呢??

1. 因為如果你沒補抓及處理,那錯誤訊息就直接顯示給使用者看了,使用者一定看不懂,只會增加困擾.

2. 如果錯誤訊息直接顯示,就是直接提供給駭客一些攻擊系統的資訊.

3. 如果補抓就有補救的機會,沒抓跳exception就是程式掛點.

那怎麼控制exception呢??最常用的就是try catch finally,程式如下

public class program
{
    static void Main()
    {
        try
        {
            StreamReader streamReader = new StreamReader(@"D:\data\a.txt");
            Console.WriteLine(streamReader.ReadToEnd());
            Console.ReadKey();
        }
        catch( Exception ex )
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
    }
}

基本使用方法就是把可能會有exception的程式碼放到try區塊裡,如果有exception的話就會被補捉.

你使用catch(Exception ex),基本上所有的exception就都能補捉到了,因為所有的exception都是從Exception這個類衍生出來的.

但是有時候Exception這個類大粗略,我想要捕捉到更詳細的錯誤資訊,那你就要加上其他的exception,如下

public class program
{
    static void Main()
    {
        try
        {
            StreamReader streamReader = new StreamReader(@"D:\data\a.txt");
            Console.WriteLine(streamReader.ReadToEnd());
            }
        catch( FileNotFoundException ex)
        {
            Console.WriteLine("File {0} Not Found!! Please Check", ex.FileName);
            }
        catch( DirectoryNotFoundException ex )
        {
            Console.WriteLine("Path {0} Not Found!! Please Check", ex.Source);
            }
        catch( Exception ex )
        {
            Console.WriteLine(ex.Message);
            }
    }
}

像上例就加了二個,分別是檢查路徑及檔名如果有誤就會跳exception,並顯示程式設計者希望給使用者看到的訊息,每個exception所包含的細部訊息都不同,視需求使用.

另有一重要要強調,越粗略的exception要放越後面,像catch(Exception ex)就必須放在最後面,不然編譯時就會有錯誤.

最後來介紹finally,它是整段程式必執行的部分,通常是用來放清資源的,程式如下

public class program
{
    static void Main()
    {
        StreamReader streamReader = null;
        try
        {
            streamReader = new StreamReader(@"D:\data\a.txt");
            Console.WriteLine(streamReader.ReadToEnd());
        }
        catch( FileNotFoundException ex)
        {
            Console.WriteLine("File {0} Not Found!! Please Check", ex.FileName);
        }
        catch( DirectoryNotFoundException ex )
        {
            Console.WriteLine("Path {0} Not Found!! Please Check", ex.Source);
        }
        catch( Exception ex )
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            if (streamReader != null)
            {
                streamReader.Close();
            }
        }
    }
}

我們最後在finally裡加了將streamReader關掉的程式碼,不管是否有跳出exception都會將streamReader關掉釋放資源.

arrow
arrow

    痞客興 發表在 痞客邦 留言(0) 人氣()