web-dev-qa-db-fra.com

Y a-t-il un moyen de lancer une exception personnalisée sans la classe Exception

Existe-t-il un moyen en C # (c'est-à-dire en .NET) de générer une exception personnalisée sans écrire tout le code permettant de définir votre propre classe d'exception dérivée de Exception?

Je pense à quelque chose de similaire que vous avez par exemple dans Oracle PL/SQL où vous pouvez simplement écrire

raise_application_error(-20001, 'An arbitary error message');

à n'importe quel endroit.

22
throw new Exception("A custom message for an application specific exception");

Pas assez bon?

Vous pouvez également lancer une exception plus spécifique si elle est pertinente. Par exemple,

throw new AuthenticationException("Message here");

ou

throw new FileNotFoundException("I couldn't find your file!");

pourrait fonctionner.

Notez que vous devriez probablement pasthrow new ApplicationException(), per MSDN

L'inconvénient majeur de ne pas personnaliser Exception est qu'il sera plus difficile pour les appelants d'intercepter. Ils ne sauront pas s'il s'agit d'une exception générale ou spécifique à votre code sans effectuer une inspection géniale de la propriété exception.Message. Vous pouvez faire quelque chose d'aussi simple que cela:

public class MyException : Exception
{
    MyException(int severity, string message) : base(message)
    {
        // do whatever you want with severity
    }
}

pour éviter ça.

Update: Visual Studio 2015 offre désormais une implémentation automatique des classes d'extension Exception - si vous ouvrez le menu Actions rapides et refactoring avec le curseur sur le : Exception, indiquez-le simplement à "Générer tous les constructeurs" .

45
Dan Field

La classe Exception n'est pas une abstract et, comme la plupart des exceptions définies dans .NET, prend un string message dans l'une des surcharges du constructeur. Vous pouvez donc utiliser un type d'exception existant, mais avec un message personnalisé.

throw new Exception("Something has gone haywire!");
throw new ObjectDisposedException("He's Dead, Jim");
throw new InvalidCastException(
    $"Damnit Jim I'm a {a.GetType().Name}, not a {b.GetType().Name}!");

Etant donné que cela utilise des types d'exceptions connus, les tiers parties peuvent ainsi plus facilement étendre vos bibliothèques, car ils n'ont pas besoin de rechercher MyArbitraryException dans les instructions catch.

7
David

Réponse courte - non.

Il y a une bonne raison pour appliquer l'héritage des exceptions personnalisées; les gens doivent pouvoir les gérer. Si vous pouviez lancer votre exception personnalisée sans avoir de type, les utilisateurs ne pourraient pas intercepter ce type d'exception.

Si vous ne voulez pas écrire une exception personnalisée, utilisez un type d'exception existant.

5
Fenton

Vous pouvez simplement lancer l'une des exceptions disponibles dans .NET:

throw new System.ArgumentException("Parameter cannot be null", "original");

Ou plus générique:

throw new ApplicationException("File storage capacity exceeded.");
3
Jaco

Un moyen simple de créer des exceptions personnalisées en c # consiste à utiliser une classe générique. Cela réduit considérablement les lignes de code si vous devez créer beaucoup d’exceptions (c’est-à-dire si vous devez les distinguer dans vos tests unitaires).

Commencez par créer une classe simple appelée CustomException<T>:

public class CustomException<T> : Exception where T : Exception
{
    public CustomException() { }
    public CustomException(string message) : base(message){ }
    public CustomException(string message, Exception innerException) : base(message, innerException){ }
    public CustomException(SerializationInfo info, StreamingContext context) : base(info, context){ }
}

Vous pouvez remplacer autant de constructeurs et de méthodes que vous le souhaitez. Pour créer de nouveaux types d'exception, ajoutez simplement de nouvelles classes one-liner:

public class MyCustomException : Exception { }
public class SomeOtherException : Exception { }

Si vous voulez augmenter votre exception personnalisée, utilisez:

throw new CustomException<MyCustomException>("your error description");

Ceci garde votre code d'exception simple et vous permet de distinguer ces exceptions:

try
{
    // ...
}
catch(CustomException<MyCustomException> ex)
{
    // handle your custom exception ...
}
catch(CustomException<SomeOtherException> ex)
{
    // handle your other exception ...
}
0
Mirko