微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

务实的程序员 - 断言式编程

如何解决务实的程序员 - 断言式编程

我正在阅读 The Pragmatic Programmer 并且在 Assertive Programming 部分中,作者说:

不要使用断言代替真正的错误处理。断言检查不应该发生的事情:您不想编写如下代码

puts(​"Enter 'Y' or 'N': "​)
ans = gets[0] ​# Grab first character of response​
assert((ch == ​'Y'​) || (ch == ​'N'​))    ​# Very bad idea!​

我只期待两个值(Y/N),如果它收到其他输入,我想断言它并抛出错误。我想了解为什么 assert 方法错误的,什么是更好的方法

解决方法

如果用户输入了无效的内容,您应该通过错误消息或警告让他们知道。由于用户的错误而故意导致崩溃永远不是一个好主意。

假设您正在编写一个简单的登录过程。如果用户输入了错误的密码,您是否会告诉他们密码不正确或导致崩溃而不让他们知道原因?


正如您提供的来源中所说,断言应该用于不应该发生的事件,并且大多数情况下,如果事件确实发生,您的程序将无法从中恢复。应妥善处理与用户输入、网络、传感器数据等相关的错误。

正如@markspace 所提到的,断言通常被禁用/可以被禁用,因此永远不应该用来代替用户端的任何类型的错误处理。

,

请查看Differences between Exception and Error

断言用于验证程序的逻辑。他们抛出一个 AssertionError,表明代码中有错误。

要处理用户错误,您应该抛出异常,并酌情处理。如果用户输入无效,则 IllegalArgumentException 是合理的,但您可能更喜欢自己的 Exception 层次结构。使用已检查或未检查的异常取决于您的偏好。

如果你想经常验证这个,你可能需要实现一个简单的验证库:

public static <T> void ensureValue(T value,T... legalValues) {
    if (!Arrays.asList(legalValues).contains(value)) {
        throw new IllegalArgumentException("Invalid value: " + value);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?