5

私の質問は、DB 例外処理の優れた方法についてです。

DB にデータを格納するアプリケーションがあるとします。次のレイヤーが実装されています。

  1. DatabaseAdapter - SQL クエリを処理し、モデルの形式で上位層にデータを提供します。アダプターには、次のようなメソッドが含まれています。
    • リスト getAllUsers()
    • void addUser(UserModel ユーザー)
  2. UserListActivity - すべてのユーザーのリストを表示し、新しいユーザーの追加などを許可します。このアクティビティは、DatabaseAdapter を使用してデータベースの読み取り/書き込みを行います。

問題は、たとえば新しいレコードを追加するときなど、データベース アクセスの例外を処理する必要があるかどうかです (レコードが常に正しく追加される必要があると仮定して)。DatabaseAdapter で例外をキャッチして、ログに追加してみませんか? それとも、まったく捕まえてはいけないのでしょうか?

4

2 に答える 2

4

ほとんどの場合、データベースにクエリを実行するときの例外は、不正な形式のクエリや、スキーマを変更してもデータベースのバージョンをインクリメントしていないなどの「開発時間」のミスの結果です。これらは非常に簡単に見つけてその場で修正できるため、エンド ユーザーはこの種のミスの影響を受けません。

ただし、次の場合には例外が発生する可能性もあります。

  • 複数のプロセスから SQLite データベースにアクセスしようとします (災害のレシピ)。
  • ユーザーのデバイスのディスク容量が不足しています。
  • ユーザー入力を適切にエスケープしていないため、クエリの形式が正しくありません。
  • onUpgrade()メソッドなどにバグがあります。
  • 参照整合性 (SQLite 3.6.19 以降で可能) を使用しており、一部のテーブル制約が失敗しています。

実際、これらのシナリオに対する普遍的な答えはありません。エンド ユーザーにとっては、たとえばアプリを強制終了させるよりも、単純なエラーを表示する方がはるかに便利です。

私の経験則は、データベースの破損を何としても回避することです。RuntimeExceptionアプリに何も言わずに何か間違ったことをさせるよりも、アプリを投げてすぐに殺してしまう方がずっとましです。また、アプリを強制終了するのではなく、挿入を完了できなかったというメッセージを表示したいと思います。

于 2013-03-11T21:49:21.813 に答える
0

この質問には、常に当てはまる共通の答えはありません。ユースケースによって異なります。ただし、常に 2 つのルールが適用されます: 上の層に詳細な例外メッセージを渡さない (UI は SQL 構文の問題について知る必要がない) ことと、意味のある例外を処理する (渡さない) ことです。 DB クラスでエラー ダイアログを表示します)。たとえば、DB クラスでデータベース例外をキャッチしてログに記録し、エラー ダイアログを表示できる UI でキャッチされるカスタム CustomerNotFoundException を再スローすることができます。

于 2013-03-11T21:44:24.637 に答える