【问题标题】:SQLiteConstraintException not caughtSQLiteConstraintException 未捕获
【发布时间】:2011-03-26 04:40:51
【问题描述】:

这段代码有什么问题?它没有捕捉到insertChild() 方法抛出的异常。

childDbOps.open();
try {
    childDbOps.insertChild(child);
} catch (SQLiteException exception) {
    Log.i("error la inserare child", "on the next line");
    exception.printStackTrace();
} finally {
    childDbOps.close();
}

错误是:

ERROR/Database(320): android.database.sqlite.SQLiteConstraintException: error code 19: 
constraint failed at com.android.dataLayer.DbAdapter.insertChild(DbAdapter.java:169) 
  at com.android.activities.ChildInsertActivity.onClick(ChildInsertActivity.java:203) 
  at android.view.View.performClick(View.java:2344) 

它是android sqlite。该行是调用插入方法的时间。

【问题讨论】:

  • 您是否尝试过使用 catch (Exception e){} 捕获任何异常?它可能会给你一个提示。
  • 异常表明它是从哪里抛出的?确保你的所有代码都在一个大的通用 try 块中,看看会发生什么。这是哪个 API - android sqlite?
  • ERROR/Database(320): android.database.sqlite.SQLiteConstraintException: 错误代码 19: com.android.dataLayer.DbAdapter.insertChild(DbAdapter.java:169) 在 com.android 的约束失败.activities.ChildInsertActivity.onClick(ChildInsertActivity.java:203) 在 android.view.View.performClick(View.java:2344) 是的,它是 android sqlite。该行是调用插入方法的时间
  • 你应该将stackoverflow.com/questions/3421577/try-catch-problem/…标记为正确答案:-)

标签: java android exception-handling try-catch


【解决方案1】:

您只捕获SQLiteException 类型的异常。如果insertChild 方法抛出任何其他异常,则不会被捕获。

try {
   childDbOps.insertChild(child);
}
catch(SQLiteException exception) {
  Log.i("error la inserare child", "on the next line");
  exception.printStackTrace();
}
catch(AnotherException exception) {
  //handle it
}
//Catch them all here
catch(Exception exception) {
  //handle it: must handle it, don't just swallow it.
}
finally {
  childDbOps.close();
}

【讨论】:

  • 我也尝试了异常,我知道这是所有异常的超类,但仍然不起作用
  • @bogdan 你确定有异常 - 抛出的异常是什么?是 childDbOps.open(); 抛出的,在 try 块外吗?
  • SQLiteConstraintException 是因为我测试了当我再次使用相同的主键输入数据时我的应用程序会发生什么,我想处理这个问题。插入方法是我的问题
  • 但不知道为什么没被抓到
  • 检查stackoverflow.com/questions/3421577/try-catch-problem/…的答案是否正确,insert()不会抛出异常,insertOrThrow()会抛出
【解决方案2】:

@bogdan 你还有其他地方调用 insertChild(child);除了这个地方。您是否在 try 块中添加了跟踪以了解是否涉及到该块并打印如下所示的跟踪。

try { Log.i("来 这里");
childDbOps.insertChild(child); }

告诉我。

【讨论】:

  • 我把它输入的日志放在那里。那是我调用该方法的唯一地方
  • @bogdan 感谢您的回复。从跟踪中我可以看到 android.view.View.performClick 方法处理异常(意味着它具有 catch 块),然后才涉及到您的捕获跨度>
  • 你好,我解决了我的问题,但没有使用 try catch。我对数据库进行了另一个查询,以检查该主键是否存在,仅此而已。我无法以这种形式解决它
【解决方案3】:

SQLiteDatabase.insert() 方法用于在写入失败时不展开堆栈的情况下处理数据库写入。如果要在插入数据库时​​捕获异常,请使用SQLite.insertOrThrow() 方法。它会抛出一个异常,然后你可以捕获并处理它。

【讨论】:

  • 这就是答案。实际报告的不是缺少捕获抛出的错误。该错误实际上并没有被抛出。但是,它被打印到日志中。然而,使用 insertOrThrow(),异常将被抛出——然后它可以被捕获。这对于解决已知问题很有用,例如 OPs 约束异常。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2012-09-22
  • 2016-01-04
  • 2017-03-26
相关资源
最近更新 更多