防御性编程和异常处理

时间:2011-09-22 17:58:45

标签: exception-handling defensive-programming

几天前,我对考试有以下理论问题: (a)解释在处理时防御性节目的含义    执行期间可能发生的特殊情况   程序。您可以参考类中看到的示例或使用伪  用于描述为防止某些情况而采取的步骤的代码 从尝试读取文件时发生的。 [5分]

(b)简要概述一下例外处理的含义    在Java中,这与防御性编程有何不同。   [5分]

我一直认为防御性编程是编程的整个范例,异常处理是其中的一部分。 在考试期间,我在“防御性编程”中写道,程序员在执行逻辑代码之前尝试找出所有可能的问题,然后在此函数中返回错误值(示例0),而在异常处理中发生潜在错误并被捕获通过特殊机制,直接解释这些错误。这样对吗?什么应该是正确的答案?

2 个答案:

答案 0 :(得分:2)

对我而言,防御性编程假设最糟糕的情况:你的用户是完全疯狂的人,你必须保护自己和你的程序免受他们疯狂的输入。我相信这句话中有很多智慧:

  

每天,软件行业都在制造更大更好的防呆软件,而且每天,大自然都在制造更大更好的傻瓜。到目前为止自然界正在赢得

永远不要忘记您的用户不仅仅是您的客户。如果您负责库API,则您的用户可能是其他部门。在那种情况下,我生命中听过的最出色的抱怨之一是:

  

即使我们删除了所有失败的单元测试,该程序也无法正常工作

答案 1 :(得分:1)

对我而言,防御性编程意味着编写代码来处理您认为不会,甚至可能发生的案例,因为您相信自己的信念是不可靠的。

例如(未编译或测试,条款和条件适用):

private String findSmallestString(Collection<String> strings) {
    if (strings == null || strings.isEmpty()) return null;
    Iterator<String> stringsIt = strings.iterator();
    try {
        String smallestString = stringsIt.next();
        while (stringsIt.hasNext()) {
            String candidateString = stringsIt.next();
            if (candidateString == null) continue;
            if (candidateString.compareTo(smallestString) < 0) {
                smallestString = candidateString;
            }
        }
        return smallestString;
    }
    catch (NoSuchElementException e) {
        return null;
    }
}

在那里,可以说具有防御性的特征包括:

  • 顶部的空或空保护条款;这是一个私有方法,因此您应该确保永远不会使用null或空集合调用它。
  • NoSuchElementException的try-catch;你可以证明它包含的代码在迭代器履行合同时永远不会抛出这个异常。
  • 来自迭代器的字符串(除了第一个!之外)的nullity guard子句;再次,因为这是一个私有方法,你应该能够确保集合参数不包含空值(你还会做什么在集合中放置空值?)

并非所有人都同意空检查具有防御性。尝试捕获是完全没有意义的。

对我而言,防御性编程的酸性测试是你不认为防守会被使用。