none
[C#] 關於try Catch程序停止問題 RRS feed

  • 問題

  • 最近發現一個問題,就是當例外產生執行Catch裡面的語法之後,但是又會繼續往下做同個函式裡面的的語法,導致額外的例外產生

               // 從專案組件讀入檔案到磁碟
                Assembly Asmb =  Assembly.GetExecutingAssembly();
                Stream ManifestStream =  Asmb.GetManifestResourceStream(Asmb.GetName().Name + ".demo.xlsx");
                FileStream FileStm = null;
                // 讀入檔案
               byte[] StreamData = new byte[ManifestStream.Length];
               ManifestStream.Read(StreamData, 0, (int)ManifestStream.Length);
                //儲存檔案
                try
                {
                    FileStm = new FileStream(Path.GetTempPath() + @"demo.xlsx", FileMode.Create);
                    FileStm.Write(StreamData, 0, (int)ManifestStream.Length);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("範本檔案儲存出錯,Excel檔案可能正在使用\n請儲存所有excel檔案,並從工作管理員將所有EXCEL程序結束\n" + Environment.NewLine + ex.Message);
                }
                   FileStm.Close();


    上面那段程式,其實就是抓到例外之後秀出一個MessageBox,之後就停止程序,但是他還會繼續往下做FileStm.Close();,因為檔案根本沒有開啟所以又發生例外

    我不是很清楚Catch之後,如果不特別做處理,是否就會直接停止程序?

    我曾嘗試過利用return來停止,但因為這是在buttom_Click裡的一個函式,如果往回跳,就回到buttom_Click裡,還是會繼續往下執行buttom_Click裡的程序造成錯誤

    我希望是當有例外產生,所有事件都不會繼續處理,那我應該怎麼做呢?



    • 已編輯 SamHuangbi 2014年8月8日 上午 10:18
    2014年8月8日 上午 10:13

解答

  • 您好,

    Catch是去處理錯誤!

    您的程式是顯示一個訊息,並沒有再將錯誤往外 throw 出去,所以不會停,會執行下面的FileStm.Close();

    您可以在該method中設定bool回傳值,然後在buttom_click中判斷是否要繼續執行後面的Code,

    或是再把錯誤 throw 出去,然後在 button_click 中也用 try ... catch 去處理它

    Other ref info : try-finally 說明


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2014年8月8日 上午 10:38
    • 已標示為解答 SamHuangbi 2014年8月10日 上午 10:00
    2014年8月8日 上午 10:35
  • 丟出例外就跟系統錯誤一樣,你在幾層的副程式裡面若是有權限錯誤,你在最外層的 Try Catch 就可以撈到了。

    ex. 第四層未處理的例外:權限錯誤

    你可以在第四層包起來做你爽的事。例如:new Exception ("我的副程式名稱發生錯誤", 原先的Exception)

    你在最外層的

    Try Catch

    所得到的 ex.Message 就是 "我的副程式名稱發生錯誤" ,ex.InnerException.Message 就是 "權限錯誤"


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 SamHuangbi 2014年8月10日 上午 09:51
    2014年8月8日 下午 03:50
  • 如果例外發生就不再往下處理, 您可以二選一:

    1:在MessageBox.Show之後使用throw將例外反應給呼叫者

    2:不製作任何處理例外的try--catch結構, 發生例如自然會結束動作, 回到上一層

    • 已標示為解答 SamHuangbi 2014年8月10日 上午 09:51
    2014年8月9日 上午 07:55

所有回覆

  • 您好,

    Catch是去處理錯誤!

    您的程式是顯示一個訊息,並沒有再將錯誤往外 throw 出去,所以不會停,會執行下面的FileStm.Close();

    您可以在該method中設定bool回傳值,然後在buttom_click中判斷是否要繼續執行後面的Code,

    或是再把錯誤 throw 出去,然後在 button_click 中也用 try ... catch 去處理它

    Other ref info : try-finally 說明


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2014年8月8日 上午 10:38
    • 已標示為解答 SamHuangbi 2014年8月10日 上午 10:00
    2014年8月8日 上午 10:35
  • 感謝解答

    不過我想問如果這個函式被其他好幾層的函式包在裡面,那就得要一層一層丟出去,然後每一層都要用trycatch去判斷嗎?直到丟到button_click在return結束...

    我只是單純想要發生錯誤就不在繼續往下處理所有button_click裡的語法了,是不是有更簡便的方法可以作處理呢?


    2014年8月8日 下午 01:40
  • 丟出例外就跟系統錯誤一樣,你在幾層的副程式裡面若是有權限錯誤,你在最外層的 Try Catch 就可以撈到了。

    ex. 第四層未處理的例外:權限錯誤

    你可以在第四層包起來做你爽的事。例如:new Exception ("我的副程式名稱發生錯誤", 原先的Exception)

    你在最外層的

    Try Catch

    所得到的 ex.Message 就是 "我的副程式名稱發生錯誤" ,ex.InnerException.Message 就是 "權限錯誤"


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 SamHuangbi 2014年8月10日 上午 09:51
    2014年8月8日 下午 03:50
  • 如果例外發生就不再往下處理, 您可以二選一:

    1:在MessageBox.Show之後使用throw將例外反應給呼叫者

    2:不製作任何處理例外的try--catch結構, 發生例如自然會結束動作, 回到上一層

    • 已標示為解答 SamHuangbi 2014年8月10日 上午 09:51
    2014年8月9日 上午 07:55