自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

巧解C#單例模式引起的自定義異常

開發(fā) 后端
今天我們將要介紹的是C#單例模式引起的自定義異常問題的解決,希望對大家有所幫助。

案例代碼

對于單例模式,C#有個簡潔的實現(xiàn),采用靜態(tài)的只讀字段實現(xiàn)。

但是如果在單例模式構(gòu)造函數(shù)中,發(fā)生了異常自定義異常,在客戶端能捕捉到嗎?

代碼下載: ConfigException為我們定義異常類,TriggerException為異常觸發(fā)類。先不要運行,猜下會捕捉到什么異常?

現(xiàn)實

事實上我們的自定義異常沒有沒Catch到,這是現(xiàn)象很隱蔽,主要是他不影響影響我們程序正常運行,只是我們費力定義的自定義異常都沒有起到任何的作用。
通常我們在單例模式的Portal工作,如果發(fā)生了異常,而如下日志記錄的異常粒度對于運維一般參考價值不大

{"“ConsoleApplication4.Singleton”的類型初始值設(shè)定項引發(fā)異常。"} [System.TypeInitializationException]: {"“ConsoleApplication4.Singleton”的類型初始值設(shè)定項引發(fā)異常。"} Data: {System.Collections.ListDictionaryInternal} HelpLink: null InnerException: {"ComplicatedCalculate 的異常"} Message: "“ConsoleApplication4.Singleton”的類型初始值設(shè)定項引發(fā)異常。" Source: "ConsoleApplication4" StackTrace: " 在 ConsoleApplication4.Program.Main(String[] args) 位置 E:\\MyStudy\\ArchitectureHOL\\ConsoleApplication4\\ConsoleApplication4\\Program.cs:行號 16" TargetSite: {Void Main(System.String[])} 解決辦法

 

還是回到經(jīng)典的單例模式的實現(xiàn)。代碼如下: 

  1.  public class Singleton  
  2.     {  
  3.        public readonly static Singleton instance = null;  
  4.        private static object objectLock = new object();  
  5.        public int Age  
  6.        {  
  7.            get;set;  
  8.        }  
  9.        public static Singleton Instance  
  10.        {  
  11.            get 
  12.            {  
  13.                if (instance == null)  
  14.                {  
  15.                    lock (objectLock)  
  16.                    {  
  17.                        if (instance == null)  
  18.                            instance = new Singleton();  
  19.                    }  
  20.                }  
  21.                return instance;  
  22.            }  
  23.        }  
  24.  
  25.        private Singleton()  
  26.        {  
  27.            TriggerException t = new TriggerException();  
  28.            t.ComplicatedCalculate();  
  29.        }  

這樣就可以Catch到我們自定義的異常了。

原因和疑惑

為什么字采用readonly Static 方式實現(xiàn)單例不能捕捉到自定的異常?這個也是調(diào)用構(gòu)造函數(shù)Singleton進而觸發(fā)異常的,這個我解釋不清楚,也是我寫此文的主要目的,希望有人討論指點下。但是我想以下兩點很重要 :

C#靜態(tài)只讀字段在作為動態(tài)常量在運行時賦值的時候出現(xiàn)異常,.Net FrameWork把他作為一個一般異常進行處理,把我們的自定義異常作為他的InnerException

C#靜態(tài)屬性在MSIL語言就是已經(jīng)看作為一個方法了。所以其調(diào)用的方法異常會被Catch而返回上一級調(diào)用者。

原文鏈接:http://www.cnblogs.com/Roping/archive/2010/12/24/1915940.html

【編輯推薦】

  1. C#取整函數(shù)實例應(yīng)用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試概念及作用的淺析
  4. C#單元測試使用的必要性的淺析
  5. C#單元測試的運行淺析
責任編輯:彭凡 來源: 博客園
相關(guān)推薦

2021-06-17 06:52:37

C#自定義異常

2009-08-03 16:37:49

C#異常類

2009-08-05 18:01:20

C#自定義異常處理

2025-01-10 09:28:25

2024-08-02 10:21:32

C#Exception類自定義異常

2009-08-11 09:16:00

2009-08-04 08:58:01

C#自定義特性

2009-08-04 12:56:51

C#自定義事件

2009-08-28 17:45:19

C#自定義數(shù)據(jù)

2009-08-03 13:34:06

自定義C#控件

2009-08-03 13:39:46

C#自定義用戶控件

2009-09-03 15:46:57

C#自定義事件

2024-11-06 11:38:59

C#單例模式

2009-08-17 17:24:02

C#自定義消息框

2009-08-04 13:07:46

C#自定義快捷鍵

2009-08-04 13:31:35

C#自定義事件

2009-08-04 12:40:34

c#自定義事件

2009-08-12 14:53:50

C#類型轉(zhuǎn)換函數(shù)

2024-09-11 14:46:48

C#旋轉(zhuǎn)按鈕

2009-08-04 09:56:46

C#事件處理自定義事件
點贊
收藏

51CTO技術(shù)棧公眾號