我想爲我的Android應用程序提供異常處理策略(儘管這也可能適用於任何Java應用程序)。例如,我在這個例子中記事本應用程序看刪除()函數的ContentProvider:需要幫助瞭解在Android中處理異常的位置
public int delete(Uri uri, String where, String[] whereArgs) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case NOTES:
count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
break;
case NOTE_ID:
String noteId = uri.getPathSegments().get(1);
count = db.delete(NOTES_TABLE_NAME, NoteColumns._ID + "=" + noteId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
發生什麼情況,如果Uri
是空?或getContext
()?或getContentresolver
()?
我得出結論,ContentResolver
不是捕捉異常的地方,但它應該重新拋出它們或拋出新的異常,以便應用程序可以顯示有意義的錯誤消息。
以下或類似的東西會不會是一個壞的方法(矯枉過正) - 我是否應該讓NullPointerException
s等泡到頂端,以更通用的方式處理(按照示例)?
public int delete(Uri uri, String where, String[] whereArgs)
throws SQLiteException, IllegalArgumentException, NotifyException {
if (null != mOpenHelper) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (null != db) {
if (null != uri) {
int count = 0;
switch (sUriMatcher.match(uri)) {
case NOTES:
count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
break;
case NOTE_ID:
String noteId = uri.getPathSegments().get(1);
count = db.delete(NOTES_TABLE_NAME, NoteColumns._ID + "=" + noteId
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (null != getContext()) && (null != getContentResolver()) {
getContext().getContentResolver().notifyChange(uri, null);
} else {
throw NotifyException("Failed to notify change");
}
return count;
} else {
throw new IllegalArgumentException("Must provide URI");
}
} else {
throw new SQLiteException("Failed to get database");
}
} else {
throw new SQLiteException("Invalid database helper");
}
}
聲明:此代碼可能無法編譯!這是一個例子。
這當然更難讀!我不知道什麼是正確的平衡,需要一些幫助!
更新:我通讀了Android的推薦做法(請參閱http://source.android.com/source/code-style.html#java-language-rules),但它讓我更加困惑!