我正在研究如何处理Android中的异常。
在Notepad Content Provider示例代码的update()
函数中,它调用getWriteableDatabase()
,可能会抛出SQLiteException
。
我注意到NoteEditor
Activity
saveNote()
函数具有以下代码:
// Commit all of our changes to persistent storage. When the update completes
// the content provider will notify the cursor of the change, which will
// cause the UI to be updated.
try {
getContentResolver().update(mUri, values, null, null);
} catch (NullPointerException e) {
Log.e(TAG, e.getMessage());
}
如果发生SQLiteException
会怎样?我希望能够在Activity
中捕获此异常,并向用户显示相应的消息(通过toast或类似的东西)。
我以为我可以通过为SQLiteException
添加额外的捕获来做到这一点。但是,我在Google文档中阅读了以下信息:
“请记住,Android系统必须能够跨进程边界传达异常.Android可以针对以下异常执行此操作,这些异常在>处理查询错误时可能很有用:
IllegalArgumentException (如果您的提供商收到>无效的内容URI,您可以选择抛出此内容)
的NullPointerException “
所以我现在很困惑 - 我可以抓住SQLiteException
吗?
答案 0 :(得分:1)
只要有可能,您应该在发生异常的类或组件中捕获异常。使用某种广播机制或返回值语义来报告跨进程的错误。
这无疑是一个棘手的情况。有人说如果在ContentProvider中发生SQLite(或其他异常),则提供程序应向上传播异常,而不是在Cursor中返回null。但是,这通常不会跨进程工作!另一方面,返回null并不会为您提供大量信息。
一组有限的异常do traverse process boundaries,但SQLiteException不在其中 - 它们可能仍然有用/适当。