「純粋に文書化する」目的でメソッドで例外をキャッチして、メソッド自体の内部にエラー文書をカプセル化する必要がありますか、それとも呼び出し元の責任ですか?
フレームワークのメソッドを含め、自分のメソッドで他の多数のメソッドを呼び出すとします。これらのメソッドは、EncryptPackage()
多数の例外をスローする可能性があります。すべてをブロックにラップするusing
ので、クリーンアップのために例外をキャッチする必要はありません (またはクリーンアップに try/finally を使用します)。とにかく例外をキャッチし、そのメソッドのコンテキストに関する詳細を提供する必要がありますか、それとも呼び出し元メソッドの責任ですか?
これがケース1です:
[Serializable]
class TestClassException : Exception
{
public TestClassException() : base() { }
public TestClassException(string message) : base(message) { }
public TestClassException(string message, Exception innerException) : base(message, innerException) { }
}
class TestClass
{
public TestClass() { }
public void EncryptPackage()
{
try
{
DoSomething();
DoAnotherThing();
}
catch (Exception ex)
{
throw new TestClassException("Error occurred during package encryption", ex);
}
}
}
class ConsumerExample
{
public ConsumerExample() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (TestClassException ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
}
このコードではEncryptPackage()
、「パッケージの暗号化中にエラーが発生しました」というテキストで「エラー テキストを装飾する」ためだけに、メソッドが考えられるすべての例外をキャッチする方法に注目してください。EncryptPackage()
ここでは、エラーの説明ロジックをカプセル化します。
そして、ここに別のテクニックがあります:
class TestClass2
{
public TestClass2() { }
public void EncryptPackage()
{
DoSomething();
DoAnotherThing();
}
}
class ConsumerExample2
{
public ConsumerExample2() { }
public void DoSomeStuff()
{
TestClass testClass = new TestClass();
try
{
testClass.EncryptPackage();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Error occurred during package encryption.\r\n\r\n" + ex.ToString());
}
}
}
この例でEncryptPackage()
は、呼び出し元が「パッケージの暗号化中にエラーが発生しました。\r\n\r\n」というメッセージでエラー ケースを文書化するため、何もキャッチしません。
これは非常に単純化された例であることに注意してください。実際には多数の階層クラスがあり、例外は長い呼び出しスタックを介して伝播します。例外をキャッチする方法としてどの方法が好まれるでしょうか? 2番目のアプローチは、「実際の処理」(ユーザーへの表示など)が行われるレイヤーで例外が処理されるため、「よりクリーン」に見えます。呼び出しスタック情報は例外オブジェクトに保存されるため、技術的には、例外がスローされた正確な場所を見つけることができます。しかし...それは、抽象化の各レベルがエラーに独自の説明を追加し、innerException
メンバーの前の例外を保持する最初のアプローチほど「十分に文書化」されていないようです。この場合、実行がTestClass
レイヤーには、このクラス内で発生したエラーの詳細な説明が既に含まれています。したがって、これはエラー処理ロジックのより良いカプセル化のように感じます.
どちらを使用しますか?