何时使用assert()以及何时使用try catch?

时间:2010-12-02 09:18:10

标签: try-catch assert

你在哪些情况下使用它们?

4 个答案:

答案 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