3 層 Web アプリケーションで例外をどこでどのように処理するか?具体的には SQL データベースの例外
-
22-09-2019 - |
質問
標準の 3 層 ASP.NET Web アプリケーションを構築していますが、特定のこと、特に例外の処理をどこで行うかについて悩んでいます。
ウェブ上でいくつかの例を調べてみましたが、すべてがどのようにリンクしているかを示すプロジェクト全体にまで及ぶ例は見つかりませんでした。
私のデータ層では、SQL Server に接続していくつかの作業を行っています。結果として発生する可能性のある例外をキャッチする必要があることはわかっていますが、どこで実行すればよいかわかりません。
私が読んだところによると、UI層でこれを行う必要がありますが、その場合、データベースへの接続が確実に閉じられるようにする方法がわかりません。これを行う方法を明確にできる人はいますか?また、ベスト プラクティスに従っている 3 層 Web アプリケーションの例をどこで見つけられるか知っている人がいれば、それも素晴らしいことです。
ありがとう
解決
答えを見つけるのは容易ではないたパターンを確保しながら成功です。のようにお 検証 戦略は、正確な例外扱い戦略は、お客様の正確な状況がしばしばトレードオフの関係に時間を総合が良いアドバイスしてできるもの:
- わない非表示のスタックトレース;なっ利用"Rethrowない限り、セキュリティ目的に隠すこういうことが起こった訳です。
- わからないと感じないエラー取り扱います。デフォルトでは、下段に、実際の誤差覚のトップ層ではない。のUIコントローラは、あなたが本当の決定に対応できるように何かおかしい。
- 毎しているため、こうした自分のようにしたいことが起きま何かが間違っています。がんができるとは思いもよく行うことのトップ層にとっても、クライアントからサーバマシンのが生産のデフォルト値が設定されます。) そのような場合には、ただのです。
- ただくには処理でポリシー資源のものを実装したIDisposable.) お客様のデータにアクセスです。(A 話 .Dispose() ご(特に)接続、コマンドdatareader。の 最後に ブロック、または(B)をご利用 使用書式]/パターン あるいは適切な処理などが挙げられる。
- 見所が誤りがとができるのであるエラー、反応(リトライ動作を待ち、第二のリトライ動作が、こういう行動別の方法等) その後も成功します。あなたは、この例外処理は成功起こるのではなく、報告書の失敗です。
- データの層を考えるように何かがおかしくなったのマルチステップです。使うためには、実際の誤差覚が、このレイヤー 必要 取扱い後片付けもしエラーとなります。しょうが使いたい。
- 非同期の状況は(A)では、複数のスレッドまたは(B)ではビジネスロジックはプロセスは、別途"タスク機械"などを行後におきに特に必要があるプログ。
- むしろ"のエラー処理コード"を25%のシェアする画面でユーザーより100%になっています。100%といったので見やすい。25%のときの時間を取り扱いの例外が本当に必要な電着技術が施されております。
他のヒント
ちょうどあなたの思考を操縦する側のポイント:あなたが同時実行の問題(デッドロック)をもたらすことができるボリュームのいずれかのタイプを持っている場合は、あなたのアプリケーションが特定のSQLエラーを検出し、操作(例えば、トランザクション)を再試行することになるでしょう。つまり、データやビジネス階層のいずれかで処理し、いくつかの例外のために主張しています。
-Krip
私は、責任ある最後の瞬間に例外を処理することがベストプラクティスであると信じています。これは通常、UI レベル (つまり、MVC アプリのコントローラー、または従来の asp.net アプリのコードビハインド) を意味します。この高いレベルで、コードはユーザーが何を求めているのか、何かが機能しない場合に何をする必要があるのかを「認識」します。
呼び出しスタックの下位で例外を処理すると、通常、呼び出しコードが例外状況を適切に処理できなくなります。
データ層では、標準パターン (例: using
声明 SqlConnection などの IDisposable の場合)、例外を文書化します。 知る が発生する可能性があります (メモリ不足やその他のまれなケースではこれを行わないでください)。発生した場合はコール スタックを上に流します。呼び出し元が多数の例外を処理する必要がある場合は、せいぜい、それらの例外をキャッチして 1 つの例外タイプにラップする必要があるかもしれません。
例外を許可する前に内容を「クリーンアップ」する必要がある場合は、いつでも finally
ブロック そうじする。その必要はありません catch
を使用するために finally
ブロック。
申し訳ありませんが、適切な例外処理を強調するように設計された小規模な Web サイトの例を知りません。
これはあなたの質問に対する具体的な答えではありませんが、ベスト プラクティスに興味がある場合は、Microsoft のパターンとプラクティスを参照してください。