2012-04-24 60 views
1

在開發模塊化應用程序時,顯然我們需要使用Fail-fast系統嗎?在開發模塊化應用程序時使用失效快速方法

當創建模塊時,如果出現錯誤條件模塊無法處理,它應該報告錯誤(如拋出異常..),而不用擔心誰會處理它。看起來這可以在開發模塊時用作指導。這有什麼問題嗎?

編輯:例

在的Module.dll

public class SomeClass:ISomeInterface 
{ 

    public void CreateFile(string filename) 
    { 
     //The module have no idea who calls this. But there is something wrong   
     //somewhere so throw an exception early. The module writer has no control over 
     //how the exception is handled. So if this exception is not handled by the 
     //Client Application the application can potentially crash.Do he need to worry 
     //about that? 
     if(filename == null) 
     { 
      throw new ArgumentNullException("Filename is null"); 
     } 

     //I think the following is bad. This code is making sure that a module 
     //exception wont crash the application.Is it good? 
     //if(filename ==null) 
     //{ 
     //Logger.log("filename is null"); 
     //return; 
     //} 
    } 
} 

回答

2

我可以看到兩類重要異常:整個系統可能已經被破壞的那些類別,並且沒有多少人可以安全地假設不是,以及那些系統的重要方面哪些代碼會「只是工作」,不會,但是沒有理由相信系統的其他部分會受到影響。在前一種情況下,除了死亡之外,程序可以做的事情並不多,可能試圖記錄發生的事情,如果可以的話,不會破壞任何「主線」數據。然而,在後一種情況下,殺死應用程序將會過於「粗魯」。恕我直言,更好的方法是設計子系統,以便代碼可以「拉上插頭」,以防止它造成數據損壞,其結果是任何進一步的嘗試使用它(除了「你還在工作」查詢,它的返回值應該表明這個問題)可能會立即引發異常,但是允許程序中那些不需要故障子系統的部分繼續保持原樣運行,除非或者直到他們認爲他們沒有多少沒有它。

+0

+1,有趣。我需要知道是否有任何方法可以殺死故障子系統?對於我們的應用程序,我們根據類型爲XML文件提供不同的GUI設計器。這些GUI設計器被創建爲模塊(子系統)。如果因爲任何原因設計人員無法工作,我希望特定的設計人員不要使用應用程序,讓系統的其餘部分按預期工作。但是這裏的問題是子系統如果在無法處理的錯誤的情況下死亡? – Jimmy 2012-04-25 15:52:14

+0

@Jimmy:一種方法是擁有一個主'IsAlive'屬性(可能由'_IsAlive'變量支持),並且擁有將使用對象測試該變量的方法。另一種方法(也可以與'IsAlive'一起使用)是使子系統方法將要使用的字段無效,可能使它們無效,或者可能用對虛擬對象的引用來替代它們,當試圖是嘗試時會引發更多信息異常使用它們。對於由鎖保護的數據結構,將鎖包裹在包含「危險」標誌的警衛中可能是有用的... – supercat 2012-04-25 16:58:14

+0

@Jimmy:...有代碼將(有希望暫時)違反不變應該在鎖定釋放時設置危險標誌,並在不變量恢復時將其清除。在設置危險標誌時調用鎖定保護裝置上的Dispose將使基礎數據結構無效,然後清除鎖定;因此,想要使用數據結構的其他代碼不會永遠等待一個永遠不會被釋放的鎖,而是也不會訪問損壞的數據。 – supercat 2012-04-25 17:00:05

0

通常,當在C++一般我實現了一個嚴重的錯誤方式,我不會讓這樣的關鍵例外,甚至離開異常處理程序 - 我調用一個全局可訪問的類實例的'criticalExit()'方法(我通常有其中的一個來存儲'全局'方法等,例如loggers,object pool),但有一個例外和一個字符串, (字符串通常只是模塊和函數名稱)。 criticalExit()鎖定互斥鎖,將其優先級提升爲'THREAD_PRIORITY_TIME_CRITICAL',打開'CriticalError.Log',將異常消息和字符串追加到文件中,關閉它並調用ExitProcess(1)(Environment.Exit(1)) 。

..只是看到,我試過在C#中做這個。這不是那麼容易生成全局可訪問的單一實例:(

+0

「模塊化」系統是口號。問這個問題的原因是這種情況幾乎是「一刀切」的情況(如果這些模塊真的被設計爲獨立工作)。每個模塊只關心自己的職責。如果應用程序使用模塊,應用程序有責任將模塊粘合在一起並處理錯誤。 – Jimmy 2012-04-24 12:49:24

+0

在答案中解釋的情況是在一個單一的應用程序中(是嗎?),我正在談論模塊 – Jimmy 2012-04-24 12:52:55

+0

模塊是程序集內代碼的邏輯集合。一個C#模塊成爲'CriticalErrorHandler'並從其他模塊調用並非不合理。 – 2012-04-24 13:05:23

1

快速失敗模塊通過對錯誤處理,但沒有檢測到它們,到下一個更高的系統設計水平責任。

從維基百科的定義,究竟是什麼的「下一個更高的系統設計水平」。如果不是至少,報告故障所以有人可以採取的糾正措施和解決問題的水平?無論是在實施由使用您的類的客戶端代碼提供的上層或者通用錯誤記者通過AppDomain.UnhandledException調用。兩者完全不受你的控制。

拋出異常。

+0

存在段錯誤/ AV,並且上面的堆棧已損壞。你會冒險解開它? 2012-04-24 12:31:28

+0

Hmya,你要冒險報告它嗎? – 2012-04-24 12:36:45

+0

+1,在大多數情況下,模塊不知道是什麼導致了錯誤。在這種情況下報告錯誤幾乎是不可能的。我同意,拋出異常,不要擔心誰處理它。順便說一下,我很難同意這一點。 – Jimmy 2012-04-24 12:44:44

相關問題