Vin*_*igh 5 java error-handling design-patterns exception-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
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用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
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说唯一重要的是,当问题发生时,我会以某种方式得到通知,我会有办法处理这种情况.哪种方式更实践?它只是取决于具体情况,还是有理由选择一个而不是另一个?
您提到的第一种方法更具C针对性,其中您有函数产生各种整数来表示函数在执行过程中如何公平。
尽管这有效,但(在我看来)引入了额外的问题,开发人员需要查看其他文档或其他开发人员代码才能理解为什么返回特定值。
在Java中,据我所知,当出现问题时(即使你预计它会出错),正确的方法总是抛出异常。使用异常的明显优点是代码更具可读性,只需查看您的方法签名我就知道您的方法可能会导致哪些潜在问题。这将使我能够更快地编写代码,因为我不需要深入研究您自己的文档或代码来查看您的方法的行为(尽管我可能需要深入研究文档/代码以查看是否可以找到解决方案)为什么你的代码抛出异常)。
另外,由于 Java 没有元组的实现来返回错误代码和值,因此您需要创建自己的元组,这可能会影响代码的可重用性和可读性,在我看来,这始终是您应该避免的事情。
编辑:
如果我的意图不是返回到我的代码并找到引发错误的位置来修复它怎么办?只是想收到发生错误的通知,这样我就可以轻松地以某种方式处理这种情况。我不想进入代码并手动修复它,而是希望能够触发另一组代码(例如handleError()方法),它有一个可以平衡问题的算法。(无论我选择哪种算法)。在这种情况下,处理异常会给我带来任何优势吗?
是的,应该如此,因为异常处理将允许您处理异常事件,因此在您的代码中,您可以这样:
while(true) {
try {
accessValue(i++);
}catch(InvalidAccessException e) {
//Execute algorithms here
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所说,当您正在调试问题时,拥有堆栈跟踪很有帮助,因为它提供了程序崩溃时调用哪些方法的信息。话虽如此,它们并不是使用异常的唯一好处(如上所述)。
我发现使用返回值的另一个潜在问题是不同的开发人员处理同一个函数时。所以你可以有一个开发人员设计的类似的东西:
function int doSomething()
{
//if it worked, yield 0
//else yield some number between 1 and 10
}
Run Code Online (Sandbox Code Playgroud)
然后另一位开发人员出现,他认为错误应该有负数并扩展了上述方法,
function int doSomething()
{
//if it worked, yield 0
//else yield some number between 1 and 10
//something else went wrong, return -1
}
Run Code Online (Sandbox Code Playgroud)
上面的内容意味着您需要遍历所有其他函数调用doSomething(),并查看它们现在是否处理返回值为负数的情况。这既麻烦又容易出错。
编辑2:
我希望我能明白你的意思。当您返回 true/false 时,我看到这个问题:假设:
public boolean foo(arg1, arg2)
{
if(arg1 is invalid) return false;
if(arg2 is invalid) return false;
}
Run Code Online (Sandbox Code Playgroud)
上面的例子中,什么false意思?这是否意味着 arg1 无效或 arg2 无效?如果您需要针对不同的参数有效性触发不同的算法怎么办?