Exception handling 防御性编程和异常处理

Exception handling 防御性编程和异常处理,exception-handling,defensive-programming,Exception Handling,Defensive Programming,几天前,我有以下关于考试的理论问题: 一个解释什么是防御性编程在处理 合同执行过程中可能出现的特殊情况 程序您可以参考课堂上看到的示例或使用pseudo 用于描述为防止某些情况而采取的步骤的代码 例如,在尝试读取文件时发生。 [5马克] 简要描述异常处理的一般含义 以及这与防御性编程的区别。 [5马克] 我一直认为防御性编程是编程的全部范例,异常处理是其中的一部分。 在考试期间,我写道,在防御性编程中,程序员在执行逻辑代码之前尝试找出所有可能的问题,然后在此函数中返回错误值示例0,而在异常处理中

几天前,我有以下关于考试的理论问题: 一个解释什么是防御性编程在处理 合同执行过程中可能出现的特殊情况 程序您可以参考课堂上看到的示例或使用pseudo 用于描述为防止某些情况而采取的步骤的代码 例如,在尝试读取文件时发生。 [5马克] 简要描述异常处理的一般含义 以及这与防御性编程的区别。 [5马克]

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

在我看来,防御性编程意味着编写代码来处理您认为不会或甚至不会发生的情况,因为您相信自己的信念是不可靠的

例如,未经编译或测试的条款和条件适用于:

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或空保护子句;这是一个私有方法,因此您应该能够确保不会使用null或空集合调用它 非接触性异常的尝试捕捉;您可以证明,如果迭代器履行其契约,那么它包含的代码永远不会抛出此异常。 字符串上的空性保护子句,而不是第一个!从迭代器中出来;同样,由于这是一个私有方法,您应该能够确保collection参数不包含空值,并且您将如何在集合中放置空值? 并非所有人都同意空检查是防御性的。试一试已经到了毫无意义的地步


对我来说,防御性编程的严峻考验是你认为防御性编程永远不会被使用。

对我来说,防御性编程是假设最坏的情况:你的用户完全是疯子,你必须保护自己和你的程序不受他们疯狂输入的影响。我相信这句话有很多智慧:

每一天,软件行业都在制造越来越大、越来越好的防愚软件,而每一天,大自然都在制造越来越大、越来越好的傻瓜。到目前为止,大自然正在获胜

永远不要忘记,你的用户不仅仅是你的客户。如果您负责库API,那么您的用户可能是其他部门。在这种情况下,我一生中听到的最强烈的抱怨之一是:

即使在我们删除了所有失败的单元测试之后,程序也无法运行


有人投票认为这是离题的。世界跆拳道联盟?令人遗憾的是,这个问题是以我应该在考试中写些什么来表达的,但这不是一个关于编程的问题吗?简洁有力。然而,我会更进一步:假设你的用户是疯狂的人,疯狂的输入不是防御性的,这是正常的;假设你自己是一个疯狂的人,做出疯狂的投入,这是防御性的。