53

テーブル グリッドをクリックするとレコードの詳細を取得する次のコードがあります。

public ActionResult City(string rk)
{ 
    try
    {
        var city = _cityService.Get("0001I", rk);
        if (city == null)
        {
            throw new ServiceException("", "Error when fetching city " + rk);
        }
    }
}

この「レコードが見つかりません」という問題には、どのような例外を使用すればよいですか? さまざまな種類の例外があることがわかりますが、どれが適切か、またはこれを正しくコーディングしているかどうかさえわかりません。

4

3 に答える 3

67

KeyNotFoundExceptionは妥当な選択であり、Microsoft のガイドラインに準拠して次のことを行います。

カスタム例外タイプを作成する代わりに、System 名前空間に存在する既存の例外をスローすることを検討してください。

ただし、次の場合は独自の型を作成することを検討できますException(これも Microsoft のガイドラインから):

...他の既存の例外とは異なる方法でプログラムで処理できるエラー状態があります。

独自の を作成する場合は、カスタム例外を設計するためExceptionのガイドラインに従う必要があります。たとえば、タイプをシリアライズ可能にする必要があります。Exception

于 2012-10-10T17:04:39.023 に答える
7

RecordNotFoundException独自の例外を作成し、この場合はそれを呼び出す必要があります。

于 2012-10-10T16:37:05.173 に答える
3

独自の例外を作成するのは非常に簡単です。クラスを作成し、名前を付け、拡張Exceptionまたはその他の例外タイプを指定し、必要なコンストラクターを提供します (基本Exceptionコンストラクターを呼び出すだけです)。

さらに追加したい場合は追加できますが、多くの場合、その必要はありません。

プロジェクトに多数の例外を作成している場合は、すべての例外を拡張する基本例外タイプ (Exception を拡張する) を作成することをお勧めします。これは、ライブラリを作成するときに行うことがあります。これにより、誰かが特定の例外、ライブラリからスローされた例外、または任意の例外をキャッチできるようになります。

public class MySuperAwesomeException : Exception
{
    public MySuperAwesomeException() : base() { }
    public MySuperAwesomeException(string message) : base(message) { }
    public MySuperAwesomeException(string message, Exception innerException)
        : base(message, innerException) { }
}
于 2012-10-10T16:44:07.910 に答える