巧解C#單例模式引起的自定義異常
案例程式碼
對於單例模式,C#有個簡潔的實現,採用靜態的只讀欄位實現。
但是如果在單例模式建構函式中,發生了異常自定義異常,在客戶端能捕捉到嗎?
程式碼下載: ConfigException為我們定義異常類,TriggerException為異常觸發類。先不要執行,猜下會捕捉到什麼異常?
現實
事實上我們的自定義異常沒有沒Catch到,這是現象很隱蔽,主要是他不影響影響我們程式正常執行,只是我們費力定義的自定義異常都沒有起到任何的作用。
通常我們在單例模式的Portal工作,如果發生了異常,而如下日誌記錄的異常粒度對於運維一般參考價值不大
{"“ConsoleApplication4.Singleton”的型別初始值設定項引發異常。"} [System.TypeInitializationException]: {"“ConsoleApplication4.Singleton”的型別初始值設定項引發異常。"} Data: {System.Collections.ListDictionaryInternal} HelpLink: null InnerException: {"ComplicatedCalculate 的異常"} Message: "“ConsoleApplication4.Singleton”的型別初始值設定項引發異常。" Source: "ConsoleApplication4" StackTrace: " 在 ConsoleApplication4.Program.Main(String[] args) 位置 E:\\MyStudy\\ArchitectureHOL\\ConsoleApplication4\\ConsoleApplication4\\Program.cs:行號 16" TargetSite: {Void Main(System.String[])} 解決辦法
還是回到經典的單例模式的實現。程式碼如下:
- public class Singleton
- {
- public readonly static Singleton instance = null;
- private static object objectLock = new object();
- public int Age
- {
- get;set;
- }
- public static Singleton Instance
- {
- get
- {
- if (instance == null)
- {
- lock (objectLock)
- {
- if (instance == null)
- instance = new Singleton();
- }
- }
- return instance;
- }
- }
- private Singleton()
- {
- TriggerException t = new TriggerException();
- t.ComplicatedCalculate();
- }
- }
這樣就可以Catch到我們自定義的異常了。
原因和疑惑
為什麼字採用readonly Static 方式實現單例不能捕捉到自定的異常?這個也是呼叫建構函式Singleton進而觸發異常的,這個我解釋不清楚,也是我寫此文的主要目的,希望有人討論指點下。但是我想以下兩點很重要 :
C#靜態只讀欄位在作為動態常量在執行時賦值的時候出現異常,.Net FrameWork把他作為一個一般異常進行處理,把我們的自定義異常作為他的InnerException
C#靜態屬性在MSIL語言就是已經看作為一個方法了。所以其呼叫的方法異常會被Catch而返回上一級呼叫者。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-682719/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#中自定義異常類C#
- C#規範整理·異常與自定義異常C#
- C#自定義異常 統一異常處理C#
- 自定義異常
- Java 異常(二) 自定義異常Java
- 自定義異常類
- Java自定義異常Java
- 自定義異常三
- Java的自定義異常類Java
- restframework 異常處理及自定義異常RESTFramework
- 異常-自定義異常的實現和測試
- Java之自定義異常Java
- 自定義PL/SQL異常SQL
- Oracle自定義異常的使用薦Oracle
- c#中單例模式詳解C#單例模式
- springboot自定義異常Spring Boot
- 使用者自定義異常
- python自定義異常,使用raise引發異常PythonAI
- 重學c#系列——盛派自定義異常原始碼分析(八)C#原始碼
- 【Django】DRF自定義異常處理Django
- C#單例模式的用途C#單例模式
- 自定義UDF函式應用異常函式
- C#設計模式——單例模式C#設計模式單例
- Java自定義異常的建立及多層呼叫Java
- Java異常處理的兩種方式以及自定義異常的使用方法Java
- 物件導向 約束、自定義異常、加密物件加密
- Java學習筆記之自定義異常Java筆記
- 2024.10.11(自定義異常)
- MySQL定義異常和異常處理詳解MySql
- C#設計模式之單例模式C#設計模式單例
- C#設計模式(1)=>單例模式C#設計模式單例
- C#設計模式(1)——單例模式C#設計模式單例
- Dubbo 自定義異常,你是怎麼處理的?
- 詳解C#異常處理C#
- 單例模式常見場景單例模式
- Spring Cloud Gateway-自定義異常處理SpringCloudGateway
- 用列舉來處理java自定義異常Java
- 關於SAVEPOINT和自定義異常使用的一點看法