web-dev-qa-db-ja.com

例外クラスなしでカスタム例外をスローする方法はありますか

C#(つまり.NET)にカスタム例外をスローする方法はありますが、Exceptionから派生した独自の例外クラスを定義するためのすべてのコードを記述する必要はありませんか?

私はあなたが簡単に書くことができるOracle PL/SQLであなたが持っているものに似た何かを考えています

raise_application_error(-20001, 'An arbitary error message');

どこでも。

28
_throw new Exception("A custom message for an application specific exception");
_

十分じゃない?

関連する場合は、より具体的な例外をスローすることもできます。例えば、

_throw new AuthenticationException("Message here");
_

または

_throw new FileNotFoundException("I couldn't find your file!");
_

動作する可能性があります。

あなたはおそらくnotthrow new ApplicationException()、ごとに [〜#〜] msdn [〜#〜] =。

例外をカスタマイズしないことの大きな欠点は、呼び出し元がキャッチするのがより困難になることです-これが一般的な例外であるか、exception.Messageプロパティでファンキーな検査を行わずにコードに固有のものであるかどうかはわかりません次のような簡単なことができます。

_public class MyException : Exception
{
    MyException(int severity, string message) : base(message)
    {
        // do whatever you want with severity
    }
}
_

それを避けるために。

Update:Visual Studio 2015では、Quick Actions and Refactoring Menu_: Exception_にカーソルを合わせて、「すべてのコンストラクタを生成する」ように指示します。

56
Dan Field

Exceptionクラスはabstractではなく、.NETで定義されているほとんどの例外と同様に、string messageコンストラクターのオーバーロードの1つ-したがって、既存の例外タイプを使用できますが、メッセージはカスタマイズされています。

throw new Exception("Something has gone haywire!");
throw new ObjectDisposedException("He's Dead, Jim");
throw new InvalidCastException(
    $"Damnit Jim I'm a {a.GetType().Name}, not a {b.GetType().Name}!");

これは既知の例外タイプを使用するため、サードパーティはMyArbitraryExceptionステートメントでcatchを探す必要がないため、ライブラリを拡張することも容易になります。

8
David

短い答え-いいえ。

カスタム例外の継承を強制する正当な理由があります。人々はそれらを処理できる必要があります。型を持たずにカスタム例外をスローできる場合、人々はその例外型をキャッチできません。

カスタム例外を作成したくない場合は、既存の例外タイプを使用します。

5
Fenton

.NETで利用可能な例外の1つをスローできます。

throw new System.ArgumentException("Parameter cannot be null", "original");

またはより一般的な:

throw new ApplicationException("File storage capacity exceeded.");
3
Jaco

C#でカスタム例外を作成する簡単な方法は、ジェネリッククラスを使用することです。これにより、多くの例外を作成する必要がある場合(つまり、ユニットテストで例外を区別する必要がある場合)に、コードの行が大幅に削減されます。

最初にCustomException<T>という単純なクラスを作成します。

public class CustomException<T> : Exception where T : Exception
{
    public CustomException() { }
    public CustomException(string message) : base(message){ }
    public CustomException(string message, Exception innerException) : base(message, innerException){ }
    public CustomException(SerializationInfo info, StreamingContext context) : base(info, context){ }
}

必要な(または必要な)コンストラクタとメソッドをいくつでもオーバーライドできます。新しい例外タイプを作成するには、新しいワンライナークラスを追加するだけです。

public class MyCustomException : Exception { }
public class SomeOtherException : Exception { }

カスタム例外を発生させたい場合:

throw new CustomException<MyCustomException>("your error description");

これにより、例外コードがシンプルになり、これらの例外を区別できます。

try
{
    // ...
}
catch(CustomException<MyCustomException> ex)
{
    // handle your custom exception ...
}
catch(CustomException<SomeOtherException> ex)
{
    // handle your other exception ...
}
1
Mirko