0

さて、私はデータベースクラスに取り組んでいて、例外を使用するように言われました. ただし、例外をできるだけ回避し、代わりに NSError を使用するために、Apple 開発者ガイドを読みました。( https://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocExceptionHandling.html )

だから私は考えました:私は正しいアプローチを使用していますか? この場合、NSErrors を使用する必要がありますか?

+(long)insertTrack:(Track *)track Database:(Database *)db {
@try {
sqlite3_exec(db.dataBase, "BEGIN", 0, 0, 0); //Start transaction

const char *sqlTrack = "INSERT INTO ...";
if(sqlite3_prepare_v2(db.dataBase, sqlTrack, -1, &addTrackStatement, NULL) != SQLITE_OK) {
     @throw [NSException exeption....]       
}

//Bind variables
sqlite3_bind_text(...);

if(SQLITE_DONE != sqlite3_step(addTrackStatement)) {
    @throw [NSException exeption....]
}
else {
    long insertedTrack = sqlite3_last_insert_rowid(db.dataBase);
    sqlite3_exec(db.dataBase, "COMMIT", 0, 0, 0); //End transaction

    return insertedTrack;
}
}
@catch(NSException *exception) {
    //Log the exception and ROLLBACK!
}
@finally {
    sqlite3_clear_bindings(addTrackStatement);
    sqlite3_reset(addTrackStatement);
    sqlite3_finalize(addTrackStatement); 
}
}

もう一度質問です。戻り値を使用して、SQL ステートメントの準備または実行で問題が発生したことを示す必要がありますか? 今のように NSError を使うべきですか、それとも Exception を使うべきですか?

4

2 に答える 2

2

iOS での例外の実装はかなり雑で非効率的です。しかし、エラーは (おそらく) めったに発生せず、とにかく SQL 操作は高速ではないため、「エントリが見つからない」という例外を使用しない限り、どちらを使用しても (パフォーマンスの点で) あまり問題にはなりません。 」および「これ以上データがない」場合。

エラー処理を個別に処理し、各操作の後にクリーンアップする必要がないため、一連の操作が多数ある場合に例外が便利です。ただし、上記の場合 (各操作の後にエラーをテストする必要がある場合)、利点はそれほど大きくありません。

そのような場合に使用できる「貧乏人の例外」スキームがあります。

errorCode = NoError;

do {
    rcode = operation1();
    if (rcode) { 
        errorCode = ErrorA;
        break;
    }        
    rcode = operation2();
    if (rcode) { 
        errorCode = ErrorB;
        break;
    }        
    rcode = operation3();
    if (rcode) { 
        errorCode = ErrorC;
        break;
    }
    <More stuff>
} until(FALSE);

if (errorCode == NoError) {
    <do normal path stuff>
}
else {
    <do error path stuff>
}

これは、私が知っているすべてのプラットフォームでかなり効率的であり、例外がない場合でも、他のほとんどのプログラミング言語に容易に変換できます。

于 2012-05-15T12:47:32.853 に答える
1

この場合はNSErrorを使用することをお勧めします。理由がわかっている場合はエラーから回復できるため、エラー コードを投稿して回復することができます。NSExceptionsは、それらから回復する方法がわからず、リリースに必要な場合に使用されますエラーと例外の詳細については、こちらをご覧ください。ここで、sqlite のエラー コードとメッセージの一覧を取得できます。それらに基づいて、コードでそれらを処理できます。

于 2012-05-15T12:45:06.850 に答える