0

私は自分の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がnullの場合はどうなりますか?または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を参照)を読みましたが、さらに混乱しました。

4

2 に答える 2

1

それを解決するためのさまざまなアプローチがあります。私は「クリーンコード」の本がとても好きです。

一般的な例外をキャッチする1つの単純なtrycatchブロックを使用できます。このcatchブロックでは、独自の記述された失敗メソッドsystemOutFailure(Uri、Context、ContentResolver)を実行できます。このメソッドは失敗をチェックし、適切な例外をスローします。とにかく、getContextがnullになることはないと思います。さらに一歩進んで、失敗メソッドを使用せずに、例外を処理して適切なものをスローする独自の失敗クラスを使用することもできます。

スローの問題は、「リッペルする」必要があるため、オブジェクト指向デザインとしては適切ではないことです。別の例外を使用して変更や拡張を行う必要がある場合、スローは非常に静的です。

于 2012-11-15T20:18:56.753 に答える
1

例外を処理するという考え方は、エラーが発生した明確な理由を示し、エラーに応じていくつかのアクションを実行することです。したがって、次のことを考慮してください。

  1. Java例外から派生した独自の例外クラスを定義する

  2. コードをtry/catchブロックに入れます。例外をキャッチすると、トレースを使用してログに記録し、明確な説明を付けて独自の例外をスローします。

  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);
}

}

于 2012-11-15T20:27:58.697 に答える