【问题标题】:How do I correctly handle errors like these in SQLite/Java/Android?如何在 SQLite/Java/Android 中正确处理此类错误?
【发布时间】:2017-02-04 00:59:30
【问题描述】:

例如我有这样的事情:

public void saveFoodatas(List<Foodata> foodataList) {
    DatabaseHelper.database.beginTransaction();
    try {
        for (Foodata foodata : foodataList) {
            saveFoodata(foodata);
        }
        DatabaseHelper.database.setTransactionSuccessful();
    }
    finally {
        DatabaseHelper.database.endTransaction();
    }
}

其中DatabaseHelper 是一个扩展SQLiteOpenHelper 的类,database 是一个SQLiteDatabase

在这个函数中,我试图让你将大量对象保存/提交到数据库,但如果出现故障,则不要提交任何更改。

我相信它当前的设置是正确的(如果有错误,它会离开我认为的 try 块并直接进入 finally,因为没有 catch),但我的问题是如何正确触发故障条件。我需要saveFoodata 来“抛出异常”吗?如果函数在我没有做任何尝试/捕获/抛出的情况下遇到某种故障,那也算吗?我该如何处理saveFooData()

【问题讨论】:

    标签: java android sqlite error-handling


    【解决方案1】:

    我认为你是在正确的轨道上。如果发生错误,您需要中止事务。您还需要提醒用户该问题。这意味着saveFoodata()saveFoodatas() 应该抛出异常,以便UI 代码可以向用户显示消息,

    【讨论】:

    • 这就是我想要理解的。 saveFoodata 中出现我没有打算/预见/在我的代码中做任何事情的错误有什么区别?这些错误会停止应用程序吗?如果我决定以某种方式解决它们,我该如何中止交易/抛出异常?
    • @user6872907 如果来自 saveFoodata() 的任何方法调用引发检查异常,那么您将收到编译错误。另一方面,如果有任何抛出运行时异常,您的应用程序将崩溃。
    • @user6872907 try...finally 正是发生错误时清理的正确方法。任何调用 saveFoodatas() 的方法都需要捕获任何可能发生的异常。
    • 在这种情况下,SQLException 是运行时异常。
    • 已检查的异常 = 我们提前预料到的事情并为 alt-cases 编写了程序,未检查的异常 = 在运行时发生的事情我们没有预见到? (我已经阅读了许多关于已检查与未检查异常的线程,但似乎没有人能够简单地解释它)
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 2021-01-06
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多