ここに2つの質問があり、これが私の見解です...
データベースの制約は適切ですか?大規模なシステムの場合、それらは不可欠です。ほとんどの大規模システムには複数のフロントエンドがあり、中間層またはUIデータチェックロジックを共有できる互換性のある言語であるとは限りません。また、Transact-SQLまたはPL/SQLのみのバッチプロセスがある場合もあります。フロントエンドでチェックを複製することは問題ありませんが、マルチユーザーアプリで真に一意性をチェックする唯一の方法は、レコードを挿入してデータベースの内容を確認することです。外部キー制約についても同じです。挿入/更新/削除を試みるまで、本当にわかりません。
例外のスローを許可する必要がありますか、それとも戻り値を置き換える必要がありますか?質問のコードは次のとおりです。
try
{
// inset data
}
catch (SqlException ex)
{
if (ex.Message.ToLower().Contains("duplicate key"))
{
if (ex.Message.ToLower().Contains("url"))
{
return 1; // Sure, that's one good way to do it
}
if (ex.Message.ToLower().Contains("email"))
{
return 2; // Sure, that's one good way to do it
}
}
return 3; // EVIL! Or at least quasi-evil :)
}
呼び出し側プログラムが実際に戻り値に基づいて動作することを保証できるのであれば、とはあなたの判断に任せるのが最善だと思いreturn 1
ますreturn 2
。私はこのような場合(たとえばDuplicateEmailException
)にカスタム例外を再スローすることを好みますが、それは私だけです-戻り値もトリックを行います。結局のところ、コンシューマークラスは、戻り値を無視できるのと同じくらい簡単に例外を無視できます。
私は反対ですreturn 3
。これは、予期しない例外(データベースのダウン、接続不良など)が発生したことを意味します。ここに不特定のエラーがあり、あなたが持っている唯一の診断情報はこれです:「3」。行を挿入しようとしたが、システムが「3」と言ったという質問をSOに投稿するとします。お知らせ下さい。それは数秒以内に閉じられます:)
データクラスで例外を処理する方法がわからない場合、データクラスのコンシューマーがそれを処理する方法はありません。この時点で、あなたはかなり困惑しているので、エラーをログに記録してから、「予期しないエラー」メッセージを表示して、可能な限り正常に終了します。
予期しない例外について少し怒鳴ったことは知っていますが、プログラマーがデータベースの例外を続かしただけで、予期しないことが発生したときにアプリがサイレントに失敗するか、ダウンストリームで失敗し、診断情報がゼロになるというサポートインシデントを処理しすぎました。非常にいたずらな。