java - 需要帮助了解 Android 中处理异常的位置

标签 java android exception android-contentprovider

我正在尝试为我的 Android 应用程序提出异常处理策略(尽管这也可能适用于任何 Java 应用程序)。例如,我正在查看示例记事本应用程序中的 delete() ContentProvider 函数:

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 等冒泡到顶部以更通用的方式处理(根据示例)?.

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 ),但这让我更加困惑!

最佳答案

处理异常的想法是显示错误发生的明确原因,并可能根据错误执行某些操作。所以,请考虑:

  1. 定义您自己的从 Java 异常派生的异常类

  2. 将代码放入 try/catch block 中。当您捕获异常时,您可以使用跟踪记录它,然后抛出您自己的异常并提供清晰的解释。

  3. 在某些时候,您捕获自己的异常,提取信息并 在屏幕上显示信息,或者如果您提供 Web 服务,则将信息发送回程序用户

代码示例:

public class MyException extends Exception {

public static final String MYSeparator = "!@#!";
public MyException() {
    super();
}

public MyException(String message) {
    super(message);
}

public MyException(Throwable cause) {
    super(cause);
}

public MyException(String message, Throwable cause) {
    super(message, cause);
}

public MyException(String errorCode, String errorDescription,
        Throwable cause) {
    super(errorCode + MYSeparator + errorDescription, cause);
}

public MyException(String errorCode, String errorDescription) {
    super(errorCode + MYSeparator + errorDescription);
}

}

关于java - 需要帮助了解 Android 中处理异常的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405263/

相关文章:

javascript - Android webview javascript 错误

java - 在 Java 中完成事务的正确代码模式是什么(异常回滚并成功提交)?

java - java/groovy 中属性的一对多映射(文件到设备)

java - 为什么我无法访问我的方法?

java - JLS 的哪一部分指定您不能从 List<?将 List<Superclass>> 扩展到 List<List<Subclass>>?

java - 使用异步 TaskManager 处理作业/步骤异常

java - rawsql 中的关系运算符无效,相同的语句在 sqldeveloper 中有效

java - 我可以在不使类泛型的情况下使构造函数泛型吗?

java - Android:双击会在不应该缩小位图图像的情况下缩小......?

java - 应该选择哪种数据结构? [安卓词典]