2012-03-06 44 views
3

我可以使用觀察者模式進行錯誤處理嗎?它有什麼優點/缺點?有沒有人爲此目的使用這種方法?我可以使用觀察者模式進行錯誤處理嗎?

UPDATE:

class MyErrorApi{ 
public static final int NETWORK_ERROR = 1; 

public(MyErrorApi error){ 
... 
} 
} 


interface ErrorListener{ 
void onErrorOcurred(MyErrorApi arror) 
} 


class MyBaseScreen implements ErrorListener{ 


void onErrorOcurred(MyErrorApi arror){ 
swirch(arror){ 
**showPopup();** 
..... 
} 
} 
+2

你能舉一個你想到的例子嗎?錯誤處理是一個相當廣泛的主題。 – biziclop 2012-03-06 08:36:39

+0

你如何處理錯誤?你是否修復它們,記錄它們,回滾到之前的狀態等等... – UmNyobe 2012-03-06 08:39:49

+1

最好從一開始;我正在嘗試解決什麼問題,然後找到最佳解決方案。你不應該從你想使用的解決方案開始,然後看看它是否適合問題。 – 2012-03-06 08:40:12

回答

6

更有可能的是,你需要一個簡單的回調像ErrorHandler

public interface ErrorHandler { 

    /** 
    * Handle the given error, possibly rethrowing it as a fatal exception 
    */ 
    void handleError(Throwable t); 

} 

這是相當普遍的做法 - 你註冊一個回調方法,當出現異常時通知某處。然而,這並非嚴格意義上的觀察者 - 目標對象的狀態沒有改變,您只會收到關於目標中發生的錯誤的通知(而另一方面,這是一種事件)。

另外通常你也可以有多個觀察者。有多個錯誤處理程序是很少見的,但不難想象。

+0

在一個更復雜和可聯機管理的系統中,您可能有一個寫日誌和一個發送通知等等。但它可能過於迂腐。 – biziclop 2012-03-06 08:44:57

+0

此方法可以推廣到EventHandler接口,而Event則作爲handleEvent方法的參數傳遞。然後錯誤信息可以在事件本身傳遞... – aviad 2012-03-06 09:37:31

2

觀察者模式可用於錯誤報告。某些東西檢測到錯誤情況併發出ErrorEvent,其他東西則將錯誤報告給日誌或管理系統。這很常見。

但是考慮你的代碼的主要流程:您可能需要採取不同的路徑

fetch customer's details 
if customer is a good credit risk 
    lend them some money 

那麼你的代碼做,如果客戶的詳細資料,不能因取到的錯誤?在概念上,你需要

fetch customer's details 
if the fetch worked AND customer is a good credit risk 
    lend them some money 

有沒有錯誤的一定程度的直接條件。我們可以通過異常處理或錯誤檢查來實現,但是我們正在這樣做,我們必須真正處理邏輯中的錯誤。

現在有可能設計出更多的事件驅動系統,通過響應事件來處理所有事情。在這種情況下,所有的事情,不僅僅是錯誤處理,都是使用Observer模式完成的。

2

觀察者模式看起來很有希望,如果你有以下的設計(或兩者)之一:

  • 我們有檢測錯誤併產生錯誤通知一個源。然後希望允許其他(未知)組件接收這些通知。
  • 我們有一個能夠處理錯誤通知,並想把它聽產生錯誤通知其他(未知)的組件核心組成部分。

在其他情況下,我們可能會發現更適合的設計。