2012-03-06 51 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

观察者模式看起来很有希望,如果你有以下的设计(或两者)之一:

  • 我们有检测错误并产生错误通知一个源。然后希望允许其他(未知)组件接收这些通知。
  • 我们有一个能够处理错误通知,并想把它听产生错误通知其他(未知)的组件核心组成部分。

在其他情况下,我们可能会发现更适合的设计。