これは多くの不必要な論争を伴う巨大なトピックです(大きな声で悪い情報を与える人々!)あなたがそれに対処する気があるなら、s1mm0tのアドバイスに従ってください、それはほとんど賛成です。
ただし、一言で答えたい場合は、PLに入れてください。深刻。それを回避できる場合は、エラー処理をグローバル例外ハンドラーに入れます(すべてのエラーはログに記録され、セキュリティ上の理由(特にWebの場合)で本番環境でログを検索するコードを提供する必要がありますが、開発中に完全な詳細を返します。速度の理由)。
編集:(明確化) どこでもいくつかのエラーに対処する必要があります-しかし、これは「すべての関数」の規範ではありません。ほとんどの場合、PLにバブルアップし、独自のコードで.NETのグローバルエラーを処理します。イベントハンドラーを介して3つのレイヤーすべてからアクセスできる共通ルーチンを介してそこから完全な呼び出しスタックをログに記録します(メッセージの下部にある編集を参照) )。これは、すべてのコードにtry/catchを振りかける必要がないことを意味します。予期してエラーが発生し、そこですぐに処理できるセクション、またはエラーをログに記録してユーザーに使用できない機能を通知する非クリティカルセクション(これはさらにまれで、非常に信頼性の高い/クリティカルプログラムの場合)
それとは別に、限られたリソースのアイテムを扱うときは、「using」キーワードを使用するか、キャッチなしでtry / final /endtryを使用することがよくあります。マルチスレッドロック/ミューテックス/再突入防止フラグなど。また、プログラムが引き続き機能するように、すべての場合にtry / finalを実行する必要があります(特にステートフルアプリ)。
例外を不適切に使用している場合(たとえば、IFステートメントを使用する必要があるときにバグ以外の処理を行う場合や、試してみる前にiffy操作が機能することを確認する場合)、この哲学はさらに崩壊します。
ちなみに、シッククライアントアプリでは、特に大量のデータやユーザーの入力が失われる可能性がある場合は、データを保存しようとする試行/キャッチを増やす方がよい場合があります(もちろんまだ有効ではないとマークされています)。 )。
編集:少なくともPLにロギングルーチンを持たせるためのもう1つの必要性-これは、プラットフォームによって動作が異なります。私たちが取り組んでいるアプリは、BLL / DALを3つのPLバージョン(ASP.Netバージョン、winformsバージョン、およびコンソールアプリバッチモード回帰テストバージョン)と共有しています。呼び出されるロギングルーチンは、実際にはBLLにあります(DALはエラーをスローするか、エラーを取得または再スローするものを完全に処理します)。ただし、これにより、PLによって処理されるイベントが発生します。Web上では、サーバーのログに記録され、Webスタイルのエラーメッセージ表示(本番環境に適したメッセージ)を実行します。WinFormsでは、テクニカルサポート情報などを含む特別なメッセージウィンドウが表示され、バックグラウンドでエラーがログに記録されます(開発者は完全な情報を表示するために「秘密」の何かを行うことができます)。そしてもちろん、テストバージョンでは、それははるかに単純なプロセスですが、同様に異なります。
パラメータ「whatplatform」を渡すことを除いて、BLLでそれをどのように行ったかはわかりませんが、ロギングが依存するwinformsまたはaspライブラリが含まれていないため、それでもトリックになります。