推荐的方法来处理算法中的问题/错误

时间:2014-04-16 05:22:41

标签: java design-patterns exception-handling error-handling

保持堆栈跟踪不受限制,让我们说“错误”的概念是你不想发生的问题,但确实如此。

如果我使用布尔系统来检查操作是否成功完成,它将看起来像这样:

String[] array = new String[10];
int i = 0;

public boolean accessValue(int id) {
     if(id < array.length) {
          //do something
          return true;
     }
     return false;
}

while(true) {
     if(!accessValue(i++)) {
          //tend to situation
     }
}

如果我使用Exceptions,它将如下所示:

class InvalidAccessException extends Throwable {

}

public boolean accessValue(int id) throws InvalidAccessException {
     if(!id < array.length || !id >= 0) 
          throw new InvalidAccessException();

     //do something
}

while(true) {
     try {
          accessValue(i++);
     }catch(InvalidAccessException e) {
          //tend to situation
     }
}

对我来说唯一重要的是,当问题发生时,我会以某种方式通知我,我会有办法处理这种情况。哪种方式更实践?它只是取决于具体情况,还是有理由选择其中一个?

1 个答案:

答案 0 :(得分:3)

您提到的第一种方法是更加面向C,其中您有函数产生各种整数来表示函数在执行过程中是如何公平的。

虽然这个工作它(在我看来)引入了额外的问题,开发人员需要通过其他文档或其他开发人员代码来了解返回特定值的原因。

在Java中,据我所知,走路的方法总是在出现问题时抛出异常(即使你预计它会出错)。使用异常的明显优势是代码更具可读性,只需查看方法签名我就知道您的方法可能导致哪些潜在问题。这将允许我更快地编码,因为我不需要深入挖掘您自己的文档或代码只是来查看您的方法的行为是什么(尽管我可能需要挖掘文档/代码到看看我是否能找到为什么是你的代码抛出异常的解决方案。

此外,由于Java没有返回错误代码和值的元组实现,因此您需要创建自己的错误代码和值,这可能会影响代码的可用性和可读性,在我看来,这是您应该避免的。

编辑:

  

如果我的目的不是回到我的代码并找到它的位置,该怎么办?   错误被抛出来修复它。只是想通知错误   发生了,在某种程度上我可以轻松地处理这种情况。   而不是我进入代码并手动修复它,我想   能够触发另一组代码(如handleError()方法),   它有一个算法可以解决问题。 (无论哪种算法   我可以选择)。处理异常会给我带来任何好处   这个案子?

是的,因为异常处理将允许您处理异常事件,所以在您的代码中,您可以拥有:

while(true) {
     try {
          accessValue(i++);
     }catch(InvalidAccessException e) {
          //Execute algorithms here
     }
}

如您所说,正在调试问题时,有一个堆栈跟踪很有用,因为它提供了程序崩溃时调用哪些方法的信息。话虽如此,它们并不是使用例外的唯一好处(如上所述)。

使用返回值时我看到的另一个潜在问题是不同的开发人员在同一个函数上工作。所以你可以拥有一个开发人员设计的东西:

function int doSomething()
{
     //if it worked, yield 0
     //else yield some number between 1 and 10
}

然后另一位开发人员认为错误应该有负数并扩展上述方法,

function int doSomething()
{
     //if it worked, yield 0
     //else yield some number between 1 and 10
     //something else went wrong, return -1
} 

上述意味着您需要遍历调用doSomething()的所有其他函数,并看到它们现在处理返回值为负的情况。这个 很麻烦, 也容易出错。

编辑2:

我希望我明白你的观点。当你返回true / false时我看到了这个问题: 假设:

public boolean foo(arg1, arg2)
{
     if(arg1 is invalid) return false;
     if(arg2 is invalid) return false;
}

在上面的例子中,false是什么意思?这是否意味着arg1无效或arg2?如果您需要为不同的参数有效性触发不同的算法怎么办?