【问题标题】:Why android.database.DatabaseUtils does not throw exceptions such as SQLException?为什么android.database.DatabaseUtils不抛出SQLException等异常?
【发布时间】:2014-09-03 22:51:09
【问题描述】:

我开始使用 Android 应用程序开发,我非常惊讶像 android.database.DatabaseUtils 这样的 API 在使用其方法时不会向上抛出异常。我想知道我认为糟糕设计的原因是什么。 (一定是有原因的..)

here为例

使用方法long execute()

public long execute() {

  if (mPreparedStatement == null) {
    throw new IllegalStateException("you must prepare this inserter before calling "+ "execute");
  }
  try {
    if (LOCAL_LOGV) Log.v(TAG, "--- doing insert or replace in table " + mTableName);
    return mPreparedStatement.executeInsert();
  } catch (SQLException e) {
    Log.e(TAG, "Error executing InsertHelper with table " + mTableName, e);
    return -1;
   } finally {
   // you can only call this once per prepare
   mPreparedStatement = null;
  }
}

所以这个方法捕获 SQLException,而不是向调用者抛出这个或另一个包装的异常,它只是返回 -1 并使用 logcat 记录错误。

作为一名开发人员,我觉得这非常令人震惊,就好像我正在使用这个 API 并且我得到一个值 -1 我知道出了点问题,但除非我检查 logcat 日志,否则我不知道为什么会出现问题。

也许我弄错了,请告诉我,但是一个 API 的方法返回 -1 的操作是一个糟糕的 OO 设计,如果出现问题它可以简单地抛出异常并让开发人员以他/她希望从 Exception 对象中提取所有详细信息的方式处理该异常。你不觉得吗?

有什么理由这样做吗?

我已将 logback 与我的应用程序集成,我希望不需要使用 logcat 来做任何事情。但是在看到这个 API 之后,恐怕我不得不以某种方式将过滤后的 logcat 导出到一个文件中,以查看当我的应用收到 -1 在 SQLlite 上执行某些操作时出了什么问题。

有什么建议吗?我在这里遗漏了什么吗?

非常感谢!

【问题讨论】:

    标签: java android database sqlite database-design


    【解决方案1】:

    首先,我们不是最初编写代码的 Google 工程师,也不是读心者。我们无法确定为什么一段代码是这样设计的。但我们可以做出有根据的猜测。考虑以下几点:

    • 数据库 API 建立在 sqlite3 C 库之上。 C 没有异常,异常错误条件通过其他方式发出信号,例如返回特殊值,例如 -1。

    • 从设计的角度来看,android.database 包中的 API 抛出异常 android.database.sqlite 包将暴露不必要的实现细节。 (尽管还有其他方法可以通过使用 SQL* 类来公开此类细节。) 正如您提到的那样,将详细的异常包装在 API 级别的异常中会更好。

    • “Utils”类通常不会真正设计。它们只是开发人员发现经常需要的方法的集合。您不必使用它们。

    • 异常处理在性能方面相对昂贵。返回特殊值要便宜得多。避免异常可能是一个好主意,尤其是在经常执行的低级代码中。虽然这一点与您链接的代码无关,因为它包含一个 try-catch 块。

    • 总的来说,Android sqlite API 并不是特别典型的设计。我以前写过它的一些奇怪的东西,例如here

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2023-04-10
      • 1970-01-01
      • 2014-07-09
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多