在Try、Catch、Finally區塊內外的Return陳述式的優先順序

  • 4690
  • 0

在Try、Catch、Finally區塊內外的Return陳述式的優先順序

下方是測試的程式碼:

        {
            string str = string.Empty;
            str="Step A";
            ViewBag.Message = str;
            try
            {
                str = " B";
                ViewBag.Message += str;
                /*註解區塊甲
                throw new Exception();
                str = " E";
                ViewBag.Message += str;
                 */
                return View();
            }
            catch (Exception ex)
            {
                str = " C";
                ViewBag.Message += str;
                /*註解區塊乙
                return View();
                 */
            }
            finally
            {
                str = " D";
                ViewBag.Message += str;
                //return View();
            }
            str = " F";
            ViewBag.Message += str;

            return View();
        }

下圖是執行結果:
image

倘若僅將註解區塊甲反註解得到的結果如下圖:
image

倘若僅將註解區塊乙反註解得到的結果如下圖:
image

觀察前述的執行結果之後,可以發現Returnt陳述式的執行優先權的順序如下:
1、Try區塊內的第一個Return陳述式。
2、若Try區塊內先發生例外,則同樣是在Try區塊之內,但是在例外之後的Return陳述式不會被執行。
3、若Try區塊內發生例外,則是Catch區塊之內的Return陳述事先執行。
4、若Try區塊內發生例外,但是Catch區塊之內並無Retrun陳述式,加上VS 2012禁止Finally區塊有Return陳述式,所以是Try、Catch與Finally區塊之外的Return陳述式被執行。

所以在一般的情況下,無論如何,還是在Try、Catch與Finally區塊之外添加一個Return陳述式比較保險。