【问题标题】:When to use assert() and when to use try catch?何时使用 assert() 何时使用 try catch?
【发布时间】:2010-12-02 09:18:10
【问题描述】:

你在什么情况下使用它们?

【问题讨论】:

    标签: try-catch assert


    【解决方案1】:

    通常assert() 在发布代码中不起作用,因此它永远无法替代try-catch 策略。不过我喜欢在抛出异常的地方使用assert()。对我(作为开发人员!)来说,通过assert() 消息到达故障线通常比通过异常堆栈更方便。

    【讨论】:

    • 这是一个关键区别,断言代码带有条件属性,因此可以在发布版本中跳过。
    【解决方案2】:

    尝试... catch - 用于异常情况,即不是由格式错误的代码引起的情况,但可能会因外部不可预知的事件而改变正常的控制流。

    捕获无效代码的断言,即检查函数中是否包含不变量,检查是否使用正确的参数调用了内部方法(对于公共 API,您可能仍需要例外)等。

    这些是我的基本准则,但惯例因情况而异,因语言而异。


    当您有疑问时,您可以问自己:在我们测试并完成所有内容之后,特定的安全检查是否应该仍然存在于发布代码中?如果你回答“是的,那么它仍然是必要的”,你可能想要一个例外。否则,您可能需要一个断言。

    【讨论】:

      【解决方案3】:

      它们是为不同的目的而创建的。 Assert 更多用于查找错误,try-catch 用于处理异常情况。

      【讨论】:

        【解决方案4】:

        try-catch 和 assert 的情况完全不同。 Assert 用于检查您收到的值(例如参数)是否是预期的。我不建议在生产代码中使用 assert,它主要用于单元测试,很少用于检查参数。 要更好地检查传递的值,请使用以下内容:

        public void test(int i) {
          if (i < 0) {
            throw new IllegalArgumentException("i cannot be less than 0");
          }
          ...
        }
        

        当您知道块内的某些内容可能出错时,使用 Try-catch 块。例如,您写入 sdcard 并且没有写入空间。或者,碰巧您尝试读取超出范围的数组。然后,将关键代码放入 try-catch 块并检查异常:

        try {
          InputStream is = new FileInputStream("filename.txt");
          ...
        } catch FileNotFoundExcpetion {
          System.out.println("file not found");
        } finally {
         ...
        }
        

        More 关于异常和 try-catch 块。

        【讨论】:

          猜你喜欢
          • 2010-12-15
          • 2011-07-09
          • 2011-03-12
          • 1970-01-01
          • 2015-10-19
          • 1970-01-01
          • 2016-06-15
          • 2019-06-16
          • 1970-01-01
          相关资源
          最近更新 更多