例外をスローするコンポーネントを作成しました。標準に固執するthrow new Exception
か、特定の例外を作成するかを考えています。
また、Remoting または WCF から例外をスローする場合、ユーザー定義の例外は魅力的ではないと考えています。標準例外を使用すると、呼び出し元は例外を受け取ることができます。ユーザー定義の例外を作成した場合、コンポーネントのアセンブリもクライアントにデプロイされていない限り、呼び出し元は特定の例外を受け取ることができません。ただし、Remoting および WCF 内からユーザー定義の例外をキャッチし、それを標準の例外として再スローすると、クライアントはユーザー定義の例外から例外を受け取ることができます。これにより、ユーザー定義の例外の目的が無効になります。
ユーザー定義例外の追加があまり役に立たないのはいつですか?
[編集]
私の考えを共有すると、ユーザー定義の例外はコンポーネントで (少なくとも 1 つ) 必須であると思います。そのため、独自のコンポーネントを単体テストする場合、誤検知は発生しません。
これにより、誤検知が発生します。
[Test]
public void Tag_is_missing()
{
string message = "";
try
{
// Arrange
// this will fail on *nix systems
MyComponentHelper.ParseXml("C:\A.XML");
}
catch(Exception ex)
{
// Act
message = ex.InnerException.Message;
}
// Assert
// How can we be sure that the word "not found" error is from
// xml parsing or if from file loading? Doing Pokemon exception handling
// will lead to ambiguities
Assert.IsTrue(message.Contains("not found"));
}
独自の例外を作成しなかった場合、単体テストで誤検知が発生する可能性があります。「見つかりません」という文字列は、コンポーネントまたはコンポーネントの他のサブシステムからのものである可能性があります。したがって、ユーザー定義の例外をいつ作成する必要があるかという私のケースがあります。
これにより、誤検知は発生しません。
[Test]
public void Tag_is_missing()
{
string message = "";
try
{
// Arrange
// this will fail on *nix systems
MyComponentHelper.ParseXml("C:\A.XML");
}
catch(XmlParsingException ex)
{
// Act
message = ex.InnerException.Message;
// Assert
// And now we are more sure that the error didn't come from
// program subsystem; in particular, file subsystem.
Assert.IsTrue(message.Contains("not found"));
}
}
考えなければならないことは、非常に具体的なユーザー定義の例外を作成する必要がある場合です。今のところ、最初に、コンポーネントに対してユーザー定義の例外を 1 つだけ設定することに決めます。単体テストで誤検知が発生することはありません。