iT邦幫忙

0

新手學 try-catch的問題 (這個到底錯在哪阿?)

  • 分享至 

  • xImage
using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        object o2 = null;
        try
        {
            int i2 = (int)o2;
            Console.WriteLine(i2);
        }
        catch (System.NullReferenceException e)
        { Console.WriteLine(e); }
        catch (InvalidCastException e)
        { Console.WriteLine(e); }
        catch
        { Console.WriteLine("Error"); }
    }
}

在小弟的理解 Try內有出現錯誤的話,可以透過Catch抓到
可是 執行到try裡面,都不會跳到下面的catch內
原本是想試試看(NullReferenceException)這個他執行時會出現的狀況
可是即使在Catch內還是會錯誤,不知道是怎麼回事

後續加上空catch還是報錯誤,還請各位大大幫解惑

錯誤截圖如下
![https://ithelp.ithome.com.tw/upload/images/20200326/20125498PuXyotXVF0.png]

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
通靈亡
iT邦高手 1 級 ‧ 2020-03-26 11:52:58
最佳解答

你的程式碼其實完全沒有錯 XDDD
會跳出錯誤訊息,是因為你勾了「於擲回這個例外狀況類型時中斷」造成的 ㄏㄏ

https://ithelp.ithome.com.tw/upload/images/20200326/20120331XjigmjDGLt.png

lazywayne iT邦新手 5 級 ‧ 2020-03-26 11:55:59 檢舉

原來是我不熟悉VS2019的問題

lazywayne iT邦新手 5 級 ‧ 2020-03-26 11:56:26 檢舉

我發現其實可以執行下去

通靈亡 iT邦高手 1 級 ‧ 2020-03-26 12:34:53 檢舉

看到順便提醒你樓下huanwen所說的:
在Catch的時候,如果你要印出Exception
建議不要直接使用e,將e轉成字串,或輸出e.Message

// 以字串輸出Exception,語意上比較清楚
Console.WriteLine(e.ToString());

// 只輸出Exception的訊息文字
Console.WriteLine(e.Message);

另外,如果你要將其他型別的變數,轉成int
在C#建議使用 Convert.ToInt32

int castNum = Convert.ToInt32(o2);

這些是關於型態的習慣。

1
zyxa9527
iT邦新手 5 級 ‧ 2020-03-26 11:09:18

可在最後加個 finally
既不是try也不是catch

try{
}
catch{
}
finally{
}

參考https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/try-finally

看更多先前的回應...收起先前的回應...
lazywayne iT邦新手 5 級 ‧ 2020-03-26 11:33:38 檢舉

加了
可是錯誤還是會跳出來

lazywayne iT邦新手 5 級 ‧ 2020-03-26 11:33:51 檢舉
using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        object o2 = null;
        try
        {
            int i2 = (int)o2;
            Console.WriteLine(i2);
        }
        catch (System.NullReferenceException e)
        { Console.WriteLine(e); }
        catch (InvalidCastException e)
        { Console.WriteLine(e); }
        catch
        { Console.WriteLine("Error"); }
        finally
        { Console.WriteLine("finally"); }
    }
}
ccutmis iT邦高手 2 級 ‧ 2020-03-26 11:38:31 檢舉

懶人包:
是 try catch finally
不是 try catch catch catch finally

可以放多個 catch
問題應該不是多個 catch 的問題

lazywayne iT邦新手 5 級 ‧ 2020-03-26 11:55:10 檢舉

多個catch是可行的,書上是這麼寫的
實際用起來也是OK的

0
huanwen
iT邦新手 5 級 ‧ 2020-03-26 11:56:46

這是因為你把Exception印出來了,但Catch裡面也是會發生例外錯誤,所以通常都是在Catch裡面做LOG

public static void Main(string[] args)
{
    object o2 = null;
    try
    {
        int i2 = (int)o2;
        Console.WriteLine(i2);
    }
    catch(Exception ex)
    {
        //Console.WriteLine(ex);
        //throw ex;
        //throw new NullReferenceException();
        //上面都會有錯誤
        
        Console.WriteLine("Error:" + ex.Message); // log message
    }
    finally
    { 
        Console.WriteLine("finally"); 
    }
}

我要發表回答

立即登入回答