星期六, 2月 27, 2016

[C#] 處理 using 所引發的 Exception

參與 K.NET C# 深耕課程 - 例外處理實務,覺得有收穫部分,以往都是在 using 內部使用 try catch,如下
using(............)
{
    try
    {
        DoSometing() ;
    }
    catch(Exception)
    {
        throw ;
    }
}
從來沒有思考過,在 using 外部使用 try catch 會發生甚麼事情
try
{
    using(............)
    {
        DoSometing();
    }
}
catch(Exception)
{
    throw ;
}
老師上課時提到,知道 using 是 try finally 的話,就會知道問題點是甚麼,當下 dmeo 跑出結果,也完全沒看出問題點,Orz


以下是根據老師的 sample code 來了解到底問題點是甚麼
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // using 內部使用 try catch
            using (demo d = new demo())
            {
                try
                {
                    d.Call();
                }
                catch (Exception)
                {
                    throw;
                }
            }

            // using 外部使用 try catch
            try
            {
                using (demo d = new demo())
                {
                    d.Call();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

    public class demo : IDisposable
    {
        public void Call()
        {
            Console.WriteLine("Call Function Fired");
            throw new InvalidProgramException("Call Exception");
        }

        public void Dispose()
        {
           throw new InvalidOperationException("Test Excpetion");
        }
    }
}
  • using 內部使用 try catch
平時使用的方式,就把 InvalidProgramException 拋出來

[C#] 處理 using 所引發的 Exception-2
  • using 外部使用 try catch
Call Function Fired 字樣有打印出來,但 InvalidProgramException 被吃掉了,拋出來的是 InvalidOperationException

[C#] 處理 using 所引發的 Exception-1

老師 slide 結論:
  • using 內部使用 try catch 會捕抓內部的 Exception
  • using 外部使用 try catch 會捕抓 Dispose 的 Exception
總算清楚當時老師在講甚麼了

沒有留言:

張貼留言