你在哪些情况下使用它们?
答案 0 :(得分:14)
尝试...捕获 - 用于异常条件,即不是由错误代码引起的条件,但可能只是通过外部不可预测的事件改变正常控制流。
捕获无效代码的断言,即检查函数中是否保留了一个不变量,检查是否使用正确的参数调用内部方法(对于公共API,您可能仍然需要一个例外)等等。
这些是我的基本准则,但各种惯例因情况和语言而异。
当您有疑问时,您可以问自己:是否在我们测试并完成所有内容后,在发布代码中仍然存在特定的安全检查?如果你回答“是的,那么它仍然是必要的”,你可能想要一个例外。否则,你可能想要一个断言。
答案 1 :(得分:5)
通常assert()
在发布代码中不起作用,因此永远无法替换try-catch
策略。不过我喜欢在抛出异常的地方使用assert()
。对我来说(作为开发人员!),通过assert()
消息获取失败线通常比通过异常堆栈更方便。
答案 2 :(得分:2)
它们是为不同目的而创建的。 Assert
更多用于查找错误,try-catch
用于处理异常情况。
答案 3 :(得分:2)
try-catch和assert的情况完全不同。 断言用于检查您收到的值(例如参数)是否是预期的。我不建议在生产代码中使用assert,它主要用于单元测试,很少检查参数。 要更好地检查传递的值,请使用以下内容:
public void test(int i) {
if (i < 0) {
throw new IllegalArgumentException("i cannot be less than 0");
}
...
}
当您知道块内的某些内容可能出错时,使用Try-catch块。例如,您写入SD卡并且没有写入空间。或者,你碰巧尝试从它的边界读取数组。然后,将关键代码放在try-catch块中并检查激活:
try {
InputStream is = new FileInputStream("filename.txt");
...
} catch FileNotFoundExcpetion {
System.out.println("file not found");
} finally {
...
}
关于异常和try-catch块的More。