web-dev-qa-db-fra.com

créer mes propres exceptions c #

Voici des exemples dans mon livre C # et je suis tombé sur un exemple de livre qui ne fonctionne pas dans Visual Studio. Il s'agit de créer vos propres exceptions, celle-ci en particulier est de vous empêcher de prendre la racine carrée d'un nombre négatif. Mais lorsque je crée la NegativeNumberException en utilisant "throw new", j'obtiens une erreur qui dit "Le nom de type ou d'espace de nom 'NegativeNumberException' est introuvable (manque-t-il une directive using ou une référence d'assembly?)"

Comment puis-je créer mes propres exceptions si ce n'est pas la bonne façon? Peut-être que mon livre est obsolète? Voici le code:

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 est juste une classe comme beaucoup d'autres classes dans .Net. Il y a, à mon humble avis, deux choses délicates avec des exceptions définies par l'utilisateur:

  1. Héritez votre classe d'exception de Exception , pas d'obsolète ApplicationException
  2. L'exception définie par l'utilisateur doit avoir de nombreux constructeurs - 4 dans le cas typique

Quelque chose comme ca:

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

Toutes les exceptions sont des types comme les autres, et si vous souhaitez définir un type d'exception personnalisé, vous devez en fait créer une classe:

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

…
5
Ry-

Étant donné que les exceptions personnalisées .NET 3.0 doivent être dérivées de Exception et non ApplicationException, utilisez donc ceci:

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

Vous devez déclarer votre classe d'exception NegativeNumberException personnalisée.

toutes les exceptions personnalisées sont des classes enfants d'exception, donc dérivez la classe NegativeNumberException de la classe Exception

Depuis MSDN:

Si vous concevez une application qui doit créer ses propres exceptions, il est conseillé de dériver des exceptions personnalisées de la classe Exception. On pensait à l'origine que les exceptions personnalisées devraient dériver de la classe ApplicationException; cependant, dans la pratique, cela n'a pas été trouvé pour ajouter une valeur significative. Pour plus d'informations, voir Meilleures pratiques pour la gestion des exceptions. ApplicationException utilise HRESULT COR_E_APPLICATION, qui a la valeur 0x80131600.

Essaye ça:

 public class NegativeNumberException : Exception
        {         


           public NegativeNumberException():base()
            {


            }   

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


            }


        }
1
Sudhakar Tillapudi