我正在尝试撰写一篇关于在Android中捕获SQL异常的文章。我想只是列出所有可能的异常类型及其可能发生的描述。
我当然访问了Android SQLException这样的网站,但信息很少......只是例外的名称。
举个例子(这个例子非常明显但我希望它们都在一篇文章中): android.database.sqlite。 SQLiteException:没有这样的列:test(代码1) - 当查询中的列错误时抛出。在升级数据库时处理此问题可能很有用。错误消息包含缺少列的名称和sqlite错误代码,在这种情况下意味着:SQL错误或缺少数据库
只需在Android中分享您对SQL异常的影响即可。提前谢谢!
答案 0 :(得分:1)
如果您确实希望列出所有可能类型的例外,那么要求社区分享他们的经验将不足以实现目标。我担心你不得不付出更多的努力来完成你的任务。当然,这可能是值得的!
我建议你做两件事:
如果它是关于Android的,它的来源确实有很好的文档,而且代码很干净。首先,您可以从半自动方法开始 - 通过java文件的rgrep。你可以找到很多你正在寻找的信息:
$ rgrep SQLite . | grep Exception |grep throw
./sqlite/SQLiteStatement.java: * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
[...]
./sqlite/SQLiteOpenHelper.java: throw new SQLiteException("Can't upgrade read-only database from version " +
./sqlite/SQLiteOpenHelper.java: throw new SQLiteException("Can't downgrade database from version " +
./sqlite/SQLiteQueryBuilder.java: * If the SQL statement is not valid, this method will throw a {@link SQLiteException}.
[...]
然后你可以更进一步 - 手动浏览它。您可能会发现SQLite *异常并不是唯一抛出的异常。例如,在android.database.DatabaseUtils
中,您可能会找到这样的方法:
public static final void writeExceptionToParcel(Parcel reply, Exception e) {
int code = 0;
boolean logException = true;
if (e instanceof FileNotFoundException) {
code = 1;
logException = false;
} else if (e instanceof IllegalArgumentException) {
code = 2;
} else if (e instanceof UnsupportedOperationException) {
code = 3;
} else if (e instanceof SQLiteAbortException) {
code = 4;
} else if (e instanceof SQLiteConstraintException) {
code = 5;
} else if (e instanceof SQLiteDatabaseCorruptException) {
code = 6;
} else if (e instanceof SQLiteFullException) {
code = 7;
} else if (e instanceof SQLiteDiskIOException) {
code = 8;
} else if (e instanceof SQLiteException) {
code = 9;
} else if (e instanceof OperationApplicationException) {
code = 10;
} else if (e instanceof OperationCanceledException) {
code = 11;
logException = false;
} else {
reply.writeException(e);
Log.e(TAG, "Writing exception to parcel", e);
return;
}
reply.writeInt(code);
reply.writeString(e.getMessage());
if (logException) {
Log.e(TAG, "Writing exception to parcel", e);
}
}
您需要找到代码的来源并记录下来。或者它可能已经记录在某处 - 我不知道。
总而言之,你正在尝试做一些看似简单的事情,但事实上并非如此。如果您想描述可能发生的所有种类的异常,则需要大量工作。决定这是否是你想要的,或者写下最常见的例外就足够了。
顺便说一句,在SQLiteException: no such column: test (code 1)
异常的情况下,我认为“在升级数据库时处理这个问题可能有用”。这意味着架构与代码不匹配。它应该尽快失败 - 这是了解您的代码无效并且需要修复的最佳方式。但这只是我的评论,不是关于你问题的本质。