none
try-catch 雙層使用問題 RRS feed

  • 問題

  • Dear All.

    例如:

    try

    {

       .....

       try

       {

          .....

       }

       catch(Exception ex)

      {

         .......

       }

    }

    catch(Exception ex)

    {

        .....

    }

    我想請問一下各位大大,在寫程式的時候你們會用到雙層的try-catch嗎?

    我有這樣子寫,可是這樣第二層的try-catch 好像沒作用

    我第二層拋出例外,程式就會直接跳到最外層的catch

    請問各位大大們,可以跟我說說第二層try-catch 為什麼會沒有作用嗎?

    感謝各位大大。

    麻煩各位了。

    2013年12月3日 上午 01:34

解答

  • 第二層try..catch是有作用的, 例如:

    int x = 0;
    int y = 10;
    int z = 100;
    try
    {
        //z = y / x;
        try
        {
            z = y / x;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Inner!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Outer!");
    }

    • 已標示為解答 黑小胡 2013年12月3日 上午 02:56
    • 已取消標示為解答 黑小胡 2013年12月3日 上午 04:00
    • 已標示為解答 黑小胡 2013年12月3日 上午 04:00
    2013年12月3日 上午 02:15
  • 您好,

    我用以下的例子來測試,會進裡面的catch,throw之後,就會進外面的catch之中哦!

    try
    {
    	try
    	{
    		TextBox txt = null;
    		txt.Text = "abc";
    
    	}
    	catch (Exception ex)
    	{
    		MessageBox.Show(ex.ToString());
    		throw;
    	}
    
    	TextBox txtB = null;
    	txtB.Text = "abc";
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.ToString());
    	throw;
    }


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

    • 已標示為解答 黑小胡 2013年12月3日 上午 02:56
    • 已取消標示為解答 黑小胡 2013年12月3日 上午 04:00
    • 已標示為解答 黑小胡 2013年12月3日 上午 04:00
    2013年12月3日 上午 02:15
  • Hi,

    你會不會是第二層的catch再寫SQL時出例外了?!

    另外 if (pow = 0)你這邊好像錯了


    謙卑學習,持之以恆,才能不斷的Level Up

    • 已標示為解答 黑小胡 2013年12月3日 上午 08:34
    2013年12月3日 上午 05:52
  • 1. 最好改用 Double.TryParse() 來測試轉型,因為 exception 的擲出會耗損系統效能。

    2. 盡可能避免兩層到多層的寫法,也應避免使用無參數的 catch,除非你接下來馬上就要 throw。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 黑小胡 2013年12月3日 上午 08:34
    2013年12月3日 上午 08:14
    版主

所有回覆

  • 第二層try..catch是有作用的, 例如:

    int x = 0;
    int y = 10;
    int z = 100;
    try
    {
        //z = y / x;
        try
        {
            z = y / x;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Inner!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Outer!");
    }

    • 已標示為解答 黑小胡 2013年12月3日 上午 02:56
    • 已取消標示為解答 黑小胡 2013年12月3日 上午 04:00
    • 已標示為解答 黑小胡 2013年12月3日 上午 04:00
    2013年12月3日 上午 02:15
  • 您好,

    我用以下的例子來測試,會進裡面的catch,throw之後,就會進外面的catch之中哦!

    try
    {
    	try
    	{
    		TextBox txt = null;
    		txt.Text = "abc";
    
    	}
    	catch (Exception ex)
    	{
    		MessageBox.Show(ex.ToString());
    		throw;
    	}
    
    	TextBox txtB = null;
    	txtB.Text = "abc";
    }
    catch (Exception ex)
    {
    	MessageBox.Show(ex.ToString());
    	throw;
    }


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

    • 已標示為解答 黑小胡 2013年12月3日 上午 02:56
    • 已取消標示為解答 黑小胡 2013年12月3日 上午 04:00
    • 已標示為解答 黑小胡 2013年12月3日 上午 04:00
    2013年12月3日 上午 02:15
  • 感謝兩位大大的範例與解釋。

    那我再問一個問題

            try
            {
                //TCP連線
                for (int i = 0; i < 6; i++)
                {
                    try
                    {
                        if (pow = 0)
                        {
                            double p0 = (double)aa.Compute("max(AI0)", string.Format("{0}<=筆數 AND {1}>=筆數", pow01, pow02));
                        }
                    }
                    catch
                    {
                        //寫入SQL
                    }
                    try
                    {
                        if (pow = 1)
                        {
                            double p1 = (double)aa.Compute("max(AI0)", string.Format("{0}<=筆數 AND {1}>=筆數", pow11, pow12));
                        }
                    }
                    catch
                    {
                        //寫入SQL
                    }
                    try
                    {
                        if (pow = 2)
                        {
                            double p2 = (double)aa.Compute("max(AI0)", string.Format("{0}<=筆數 AND {1}>=筆數", pow21, pow22));
                        }
                    }
                    catch
                    {
                        //寫入SQL
                    }

                }
            }
            catch (Exception ee)
            {
                //存入LOG檔

                MessageBox.Show(ee.ToString());

            }

    之前我是用迴圈問狀態裡面都有try-catch

    我用逐步執行的時候如果拋出例外,無效的型態轉換

    那程式就會跑到最外面的catch 而不是第二層的catch,程式就跨過其他的try-catch執行下去了

    因為我剛好遇到這個狀況,所以想問問大大們,這樣的try-catch用法是不是不好?

    2013年12月3日 上午 03:18
  • Hi,

    你會不會是第二層的catch再寫SQL時出例外了?!

    另外 if (pow = 0)你這邊好像錯了


    謙卑學習,持之以恆,才能不斷的Level Up

    • 已標示為解答 黑小胡 2013年12月3日 上午 08:34
    2013年12月3日 上午 05:52
  • Hi,蹂躪大

    Sorry沒有打好,

    if (Pow == 0 && ling.Rows[0][0].ToString() == "0")

    我的IF是這樣的,

    我有在這段程式碼下中斷點,

    double p0 = (double)aa.Compute("max(AI0)", string.Format("{0}<=筆數 AND {1}>=筆數", pow01, pow02));

    但是在用逐步執行的時候出現無效轉換的例外,然後就直接出現MessageBox.Show(ee.ToString());了

    SQL可以正常寫入,我是怕說我的用法不對才會造成這樣的情況。

    2013年12月3日 上午 07:16
  • 1. 最好改用 Double.TryParse() 來測試轉型,因為 exception 的擲出會耗損系統效能。

    2. 盡可能避免兩層到多層的寫法,也應避免使用無參數的 catch,除非你接下來馬上就要 throw。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 黑小胡 2013年12月3日 上午 08:34
    2013年12月3日 上午 08:14
    版主
  • 感謝小朱大大與各位大大的熱情回答,

    還多學了Double.TryParse()的型態轉換

    受益良多,感謝大家。

    還希望大家多多指教。

    2013年12月3日 上午 08:50