試煉7 - 認真的問該如何拋例外

2022 鐵人賽文 搬回點部落

開始試煉

try catch 是控制錯誤很重要的機制
有個新手常發生的問題必須出新手村前要通過試煉
請指出下面程式碼不良的寫法
(怕有人沒看清楚我故意加上一堆這是錯誤示範)

//這是錯誤示範
static void Main(string[] args)
{
    try
    {
        廚房();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    Console.ReadKey();
}
//這是錯誤示範
static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
//這是錯誤示範
static void 廁所()
{
    throw new Exception("發現小強!!");
}
//這是錯誤示範

先來看看Log到怎樣的資訊
System.Exception: 發現小強!!
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\code\Yame.Tools\TestConsole\Program.cs: 行 26
有發現問題嗎 並沒有紀錄到錯誤的方法是 廁所()
反而變成 廚房()
這樣寫就是再改變 案發現場 誤導工程師去錯誤的場所打小強
千萬不可以寫 throw ex; 這樣就是把案發現場改到廚房

請這樣寫

static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw;
    }
}

System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26
這樣就可以正確記錄了

視情況也有一種作法 就是放到InnerException

static void 廚房()
{
    try
    {
        廁所();
    }
    catch (Exception ex)
    {
        throw new Exception("看到小強但找不到",ex);
    }
}

System.Exception: 看到小強但找不到 –-> System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 38
–- 內部例外狀況堆疊追蹤的結尾 –-
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26

延伸試煉

很完整的例外好文
Exception 怎麼丟才丟得好
Exception 怎麼丟才丟得準
Exception 怎麼接才接得漂亮

Huan-Lin 老師的文章
C# 例外處理(Exception Handling)

結束試煉

請記得正確的拋例外

如果內容有誤請多鞭策謝謝