web-dev-qa-db-fra.com

Quel est le meilleur moyen de générer une exception en C #?

Je déploie traditionnellement un ensemble de pages Web permettant la validation manuelle des fonctionnalités de base de l'application. LoggerTest.aspx en est un exemple. Il génère et consigne une exception de test. J'ai toujours choisi de créer une exception DivideByZeroException en utilisant une approche similaire à l'extrait de code suivant: 

try
{
   int zero = 0;
   int result = 100 / zero;
}
catch (DivideByZeroException ex)
{
   LogHelper.Error("TEST EXCEPTION", ex);
}

Le code fonctionne très bien, mais j’ai le sentiment qu’il doit exister une solution plus élégante. Existe-t-il un meilleur moyen de générer une exception en C #?

40
Ben Griswold
try
{
  throw new DivideByZeroException();
}
catch (DivideByZeroException ex)
{
  LogHelper.Error("TEST EXCEPTION", ex);
}
69
GalacticCowboy

Réponse courte:

throw new Exception("Test Exception");

Tu auras besoin de 

using System;
26
Jesse Millikan

Construire une exception personnalisée à des fins de test? Vous pouvez ensuite ajouter les propriétés personnalisées que vous souhaitez que l’exception emporte avec elle tout au long du processus de traitement/de journalisation des exceptions ... 

 [Serializable]
 public class TestException: ApplicationException
 {
     public TestException(string Message, 
                  Exception innerException): base(Message,innerException) {}
     public TestException(string Message) : base(Message) {}
     public TestException() {}

     #region Serializeable Code
     public TestException(SerializationInfo info, 
           StreamingContext context): base(info, context) { }
     #endregion Serializeable Code
 }

dans votre classe 

 try
 {  
      throw new TestException();
 }
 catch( TestException eX)
 {  
    LogHelper.Error("TEST EXCEPTION", eX);
 }
5
Charles Bretana

jeter exceptionnellement;

N'est-ce pas?

Exemple que j'ai trouvé était

        if (args.Length == 0)
        {
            throw new ArgumentException("A start-up parameter is required.");
        }
3
Tablet

Alors, permettez-moi de continuer à faire comme si vous étiez. Vous ne voulez pas tester ce qui se passe quand une DivideByZeroException est lancée; vous voulez tester ce qui se passe quand une division par zéro se produit réellement. 

Si vous ne voyez pas la différence, réfléchissez aux points suivants: Etes-vous vraiment sûr de vouloir vérifier NullRefernceException et quand ArgumentNullException?

3
James Curran
        try
        {
            string a="asd";
            int s = Convert.ToInt32(a);
        }
        catch (Exception ex)
        {

            Response.Write(ex.Message);
        }

Il renverra une exception "La chaîne d'entrée n'était pas dans un format correct."

2
Sunil Patil

Merci pour les commentaires. J'ai marqué la réponse de GalacticCowboy comme étant correcte, car il s'agit manifestement de la bonne réponse en fonction de la formulation de la question. 

Pour ceux qui pensent "il doit y avoir plus à cette question", vous avez raison. En substance, je cherchais le meilleur moyen de générer/provoquer/simuler une exception. Comme James Curran l’a déclaré, c’est l’occurrence de l’exception plutôt que le lancement d’une exception que je recherche. Forcer une exception DivideByZeroException est ma stratégie par défaut, même si je pensais qu'il pourrait y avoir un autre moyen, voire même une meilleure exception, à forcer. 

Plus que probablement, il n'y a pas de différence entre lancer et "élever" une exception. La majorité des réponses semblent au moins être de cet avis. 

Merci encore pour les commentaires et désolé si la question était vague.

2
Ben Griswold

throw new DivideByZeroException("some message");?

Ou est-ce que je manque quelque chose?

1
Greg Beech

Si vous testez simplement la méthode Error de LogHelper, pourquoi même lancer l'exception? Vous avez juste besoin d'un one-liner:

LogHelper.Error("TEST EXCEPTION", new Exception("This is a test exception"));
1
Collin K

Est-ce que 

System.Diagnostics.Debug.Assert(condition);

te donner une alternative? 

Peut-être alors utiliser

catch (AssertionException) { }

enregistrer un échec de test.

Voir aussi C # - Que fait la méthode Assert ()? Est-ce toujours utile? et http://fr.csharp-online.net/Assert .

0
Steve Pitchers
public class CustomException: Exception
{
     public CustomException(string message)
        : base(message) { }

}

//if(something == anything) { throw new CustomException(" custom text message"); }

tu peux essayer ça

0
Muzafar Hasan

À des fins de test, vous souhaiterez probablement créer une classe spécifique (par exemple TestFailedException?) Et la lancer plutôt que de détourner un autre type d'exception.

0
yuriks