web-dev-qa-db-ja.com

独自の例外を作成するc#

C#ブックの例を参照すると、Visual Studioで機能しないブックのサンプルが見つかりました。独自の例外の作成を扱います。これは特に、負の数の平方根を取るのを防ぐためのものです。ただし、「throw new」を使用してNegativeNumberExceptionを作成すると、「型または名前空間名「NegativeNumberException」が見つかりません(usingディレクティブまたはAssembly参照がありませんか?」というエラーが表示されます)

これが正しい方法ではない場合、どうすれば独自の例外を作成できますか?私の本は古くなっているのでしょうか?コードは次のとおりです。

class SquareRootTest
{
    static void Main(string[] args)
    {
        bool continueLoop = true;

        do
        {
            try
            {
                Console.Write("Enter a value to calculate the sqrt of: ");
                double inputValue = Convert.ToDouble(Console.ReadLine());
                double result = SquareRoot(inputValue);

                Console.WriteLine("The sqrt of {0} is {1:F6)\n", inputValue, result);
                continueLoop = false;
            }
            catch (FormatException formatException)
            {
                Console.WriteLine("\n" + formatException.Message);
                Console.WriteLine("Enter a double value, doofus.\n");
            }
            catch (NegativeNumberException negativeNumberException)
            {
                Console.WriteLine("\n" + negativeNumberException.Message);
                Console.WriteLine("Enter a non-negative value, doofus.\n");
            }
        } while (continueLoop);
    }//end main
    public static double SquareRoot(double value)
    {
        if (value < 0)
            throw new NegativeNumberException(
                "Square root of negative number not permitted.");
        else
            return Math.Sqrt(value);
    }
}
21
Evan Lemmons

Exceptionは、.Netの他の多くのクラスと同様に、classです。私見では、ユーザー定義の例外を伴う2つのトリッキーなことがあります。

  1. 廃止されたApplicationExceptionからではなく、Exceptionから例外クラスを継承します
  2. ユーザー定義の例外には、多くのコンストラクターが必要です-4

そんな感じ:

public class NegativeNumberException: Exception {
  /// <summary>
  /// Just create the exception
  /// </summary>
  public NegativeNumberException()
    : base() {
  }

  /// <summary>
  /// Create the exception with description
  /// </summary>
  /// <param name="message">Exception description</param>
  public NegativeNumberException(String message)
    : base(message) {
  }

  /// <summary>
  /// Create the exception with description and inner cause
  /// </summary>
  /// <param name="message">Exception description</param>
  /// <param name="innerException">Exception inner cause</param>
  public NegativeNumberException(String message, Exception innerException)
    : base(message, innerException) {
  }

  /// <summary>
  /// Create the exception from serialized data.
  /// Usual scenario is when exception is occured somewhere on the remote workstation
  /// and we have to re-create/re-throw the exception on the local machine
  /// </summary>
  /// <param name="info">Serialization info</param>
  /// <param name="context">Serialization context</param>
  protected NegativeNumberException(SerializationInfo info, StreamingContext context)
    : base(info, context) {
  }
}
51
Dmitry Bychenko

すべての例外は他の例外と同様のタイプであり、例外のカスタムタイプを定義する場合は、実際にクラスを作成する必要があります。

/* You could also use ArgumentException, etc. */
class NegativeNumberException : Exception {
    …
}

…
5
Ry-

.NET 3.0カスタム例外 派生する必要があります からExceptionではなくApplicationExceptionからなので、これを使用します:

public class NegativeNumberException : Exception
{ 
    public NegativeNumberException():base() { } 
    public NegativeNumberException (string message): base(message) { }
}
2
swandog

カスタムException NegativeNumberExceptionクラスを宣言する必要があります。

すべてのカスタム例外は例外の子クラスなので、NegativeNumberExceptionクラスからExceptionクラスを派生させます

MSDNから:

独自の例外を作成する必要があるアプリケーションを設計している場合、Exceptionクラスからカスタム例外を派生することをお勧めします。もともと、カスタム例外はApplicationExceptionクラスから派生するものと考えられていました。ただし、実際には、これが大きな価値をもたらすことは確認されていません。詳細については、例外処理のベストプラクティスを参照してください。 ApplicationExceptionは、値0x80131600を持つHRESULT COR_E_APPLICATIONを使用します。

これを試して:

 public class NegativeNumberException : Exception
        {         


           public NegativeNumberException():base()
            {


            }   

            public NegativeNumberException (string message): base(message)
            {


            }


        }
1