0

本の例に従って、次のわずかに変更されたコードを取得しました。

 class OutOfHoneyException : Exception
 {
    public OutOfHoneyException(string message) :base(message){}
 }

    class HoneyDeliverSystem
    {
        public void FeedHoneyToEggs()
        {
            if (true)
            {
                throw new OutOfHoneyException("This hive is Out Of Honey");
            }
        }
    }

....................................。

 HoneyDeliverSystem delivery = new HoneyDeliverSystem();

      try
        {
            delivery.FeedHoneyToEggs();
        }
        catch (OutOfHoneyException ex)
        {

            Console.WriteLine(ex.Message);
        }

特定の例外が特定の条件でスローされたときに私が理解していることは、対応するcatchブロックがそれを処理することです。

しかし、より良い例で私を助けてください、多分.NET例外の実装は本当に役立つでしょう。

そして、なぜメッセージを基本Exceptionクラスに渡すのですか?印刷専用ですか?

基本クラスコンストラクターを呼び出す子クラスにはOOPSの概念があります。名前を付けて、カスタム例外の例とどのように関連しているかを教えてください。

4

4 に答える 4

1

あなたは一般的な慣習からそれほど遠くはありません。私はこのようにそれをしたでしょう:

class OutOfHoneyException : Exception {
  public OutOfHoneyException() : base("This hive is Out Of Honey"){}
}

class HoneyDeliverSystem {
  public void FeedHoneyToEggs() {
    throw new OutOfHoneyException();
  }
}

つまり、別のメッセージを表示する理由OutOfHoneyExceptionはありませんか?

于 2013-03-02T10:43:46.780 に答える
1

最善の方法は、新しい例外を独自のファイルに入れて公開することです。基本Exceptionクラスには4つのコンストラクターがあり、ほとんどの場合、少なくとも最初の3つを実装すると便利です。

public class OutOfHoneyException : Exception
{
    public OutOfHoneyException()
        : base()
    {
    }

    public OutOfHoneyException(string message)
        : base(message)
    {
    }

    public OutOfHoneyException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    public OutOfHoneyException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

クラスから継承しExceptionます。これは、カスタム例外を処理するときに期待されるすべての基本的な例外の実装/動作が含まれているためです。

新しいカスタム例外を通常の.NET例外のように感じさせるには、4つのコンストラクターすべてを実装する必要があります。

例外について学ぶときに注意すべき2つのことは、1つは例外が例外的な動作に対してのみスローされる必要があること、もう1つは例外がプログラムフローの制御に使用されるべきではないということです。これらの2つのルールは一種の組み合わせです。

たとえば、在庫管理システムに豆の缶の在庫数を問い合わせる場合、結果0が一般的な回答になり、顧客にとって望ましい回答ではありませんが、例外ではありません。豆の缶の在庫システムを照会し、データベースサーバーが利用できなかった場合、それは予想していた一般的な結果以外の例外的な動作です。

于 2013-03-02T11:23:31.757 に答える
0

メッセージを基本クラス(Exception)に渡すと、基本クラスは例外のMessageプロパティを設定し、StackTraceの保持などのすべての役立つ処理を実行します。

したがって、カスタム例外(OutOfHoneyException)をキャッチすると、メッセージフィールドは基本のExceptionクラスによって設定されます。実装から次のコードをチェックアウトします。

/// <summary>
/// Initializes a new instance of the <see cref="T:System.Exception"/> class with a specified error message.
/// </summary>
/// <param name="message">The message that describes the error. </param>
public Exception(string message)
{
  base..ctor();
  this.Init();
  this._message = message;
}

/// <summary>
/// Initializes a new instance of the <see cref="T:System.Exception"/> class with a specified error message and a reference to the inner exception that is the cause of this exception.
/// </summary>
/// <param name="message">The error message that explains the reason for the exception. </param><param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. </param>
public Exception(string message, Exception innerException)
{
  base..ctor();
  this.Init();
  this._message = message;
  this._innerException = innerException;
}
于 2013-03-02T10:46:48.073 に答える
0

例外を作成する方法を説明する回答を書くのではなく、特定の質問に答えようとします。

そして、なぜメッセージを基本のExceptionクラスに渡すのですか?印刷専用ですか?

多かれ少なかれ。メッセージは、例外にコンテキストを追加することです。OutOfHoneyExceptionがスローされる理由はいくつか考えられます。たとえば、ミツバチが眠っている、休暇中、アリクイがアリを使い果たして、代わりにミツバチが好きだと判断したなどです。

基本クラスコンストラクターを呼び出す子クラスにはOOPSの概念があります。名前を付けて、カスタム例外の例とどのように関連しているかを教えてください。

派生クラスで使用するコンストラクターに関係なく、別のコンストラクターを指定しない限り、デフォルトのコンストラクターは常に基本クラスで呼び出されます(これがここで行われていることです)。これは基本的なコンストラクターのオーバーロードであり、派生クラスを作成するときに適度な柔軟性を提供します(コンストラクターチェーンがあることにも注意してください)。

于 2013-03-02T11:18:04.980 に答える