例外処理は分野横断的な懸念事項ですか?


13

例外処理とログ記録の両方の懸念は、どちらも横断的な関心事であるという点で、ほとんど違いは見られません。どう思いますか?メソッドが実装しているコアロジックとインターリーブするのではなく、単独で個別に処理すべきではありませんか?

編集:私が言いたいことは、私の意見では、メソッドの実装には実行の成功パスのロジックのみを含める必要があり、例外は他の場所で処理する必要があるということです。これは、チェック済み/未チェックの例外に関するものではありません。

たとえば、言語は次のような構造を使用して、完全にチェックされた方法で例外を処理します。

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

上記の概念言語では、クラスのreadFileが例外をスローしていないため、FileReader handlerがない場合、プログラムはコンパイルされません。そのため、ハンドラーを宣言することで、コンパイラーはハンドラーが処理され、プログラムがコンパイルされることを確認できます。FileReader FileReader

このようにして、チェック済みおよび未チェックの例外問題の両方の長所、つまり堅牢性と可読性が得られます。

回答:


14

ある場合にははい

ログに記録したい例外がある場合(ほとんどの場合はこれを想定しています)、はい、例外は横断的な懸念事項に関連しています。

ほとんどの場合

ただし、SocketListenerのインスタンスを使用します。ソケットリスナーが接続を切断したために例外をスローする場合、これは予期される動作であるため、アプリケーションは例外を引き起こした状況に従って動作する必要があります。これは一般的なアスペクトが処理すべきものではないため、横断的な関心事ではありません。

横断的関心事の特定

同じコードを繰り返し複製する場合は、抽象化する必要があります。抽象化がそれ自体を複数のレイヤーにプロモートする場合、横断的な関心事になる可能性があります。その場合にのみ、検討する必要があります。


4

ロギングはオプションです。例外の処理はそうではありません。

ロギングは非常に一般的であり、特定のロジックからソースを取得する一方で、一般的なコンシューマーに供給します。例外は常にロジックに固有のものであり、そのロジックについて知識のあるコードは、作成した混乱を処理する必要があります。

少なくとも私の2つの使用が限られているということは、2つの目標は同じデザインの傘の下ではなく、異なる方法で最適に処理されることを意味します。


1

例外処理は、特定の種類の例外に対する横断的な関心事です。即時呼び出しコードのみが正しく処理できるローカル例外があります。例として、クエリを実行しようとしたときのデータベース例外があります。しかし、よりグローバルに処理できる例外もあります。例としては、セキュリティ資格情報の欠如に関連する例外があります(ユーザーに再度ログインを強制します)。または、少なくとも、例外がより具体的なコードをすり抜ける場合、グローバルハンドラーが必要です。これは、ユーザーにITの再起動またはログの送信などを行うために何をすべきかを説明するためです。これらのタイプのグローバルに処理される例外については、横断的な懸念事項です。


0

これは、リーキーな抽象化の問題と関係があると思います。

多くの例外は、抽象化の層を伝播するときにキャッチして再スローする必要があります。再スローは、再スローを実行している抽象化に適した新しい形式で例外をスローする必要があります。これにより、インターフェイスの一部として意味をなします。言い換えれば、抽象化のより高いレベルが純粋に例外処理のためであっても、抽象化のより高いレベルがより低いレベルについて知る必要がないように、抽象化のより低いレベルからの例外はcurrent-abstraction形式に変換されるべきです。

ただし、「漏れやすい抽象化の原理」は問題です。一部の例外は、次の抽象化層内で意味のある形式に変換できません。

ネットワーク化されたファイルシステム関連の例外は簡単な例です。ネットワーク障害は、「ファイル」抽象化に意味のある用語で表現することはできません。また、そうする場合、その抽象化はファイル処理の実装に関連するすべての詳細を完全に抽象化していない。

したがって、ネットワーク障害は、基礎となるネットワーク抽象化から漏れるので、残りのコード内で横断的な関心事でなければなりません。

ただし、これは例外に固有のものではありません。実際にはファイルの抽象化に関係していないファイルAPIの戻り値エラーコードはすべて、代わりにハードディスクまたはネットワーク、またはエラーが異なる形式で同じものであることが詳細に示され、ハードディスクの障害とネットワークの障害を意味しますなどは、それらの障害がどのように報告されるかに関係なく、横断的な関心事です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.