web-dev-qa-db-fra.com

Quelle exception lancer sur un objet non valide?

J'ai toujours manqué un type d'exception intégré dans c # qui indiquerait qu'un objet est corrompu. Que jettes-tu dans de tels cas?

Généralement, ça me manque quand je réalise qu'une méthode supposée fonctionner sur un objet échouera si l'objet a un certain état. Dans de telles situations, je soupçonne souvent que cet état ne sera probablement jamais atteint. Mais, étant sur la défensive, j'aimerais lancer une exception au cas où cela se produirait (par exemple, après un changement de code futur).

Pour les arguments de méthode, nous avons ArgumentException, ce qui nous permet de refuser les paramètres non valides. Mais pour l'état d'objet? En Java, j'utiliserais IllegalStateException.

Bien sûr, vous pouvez affirmer que les méthodes, qui modifient réellement l'état, pourraient vérifier l'exactitude de l'état. Et ils feraient mieux de le faire, mais alors s'ils ne le font pas (par exemple dans les classes de dieu héritées)?

Modifier:

Bien que InvalidOperationException semble être la meilleure solution, comme le dit la réponse acceptée (et aussi celle-ci ), veuillez noter que:

C'est subtil, mais cela a une signification sémantique différente de InvalidOperationException. InvalidOperationException indique un problème dans le "protocole" de l'objet, auquel l'appelant doit obéir (par exemple, non initialisé, déjà fermé, ...). Dans mon cas, l'appelant n'a rien fait de mal, c'est l'objet qui est cassé. Je voudrais transmettre exactement ce message.

Exemple:

switch(this._someType) {
  case SomeType.A: doSomething(); break;
  case SomeType.B: doSomethingElse(); break;
  /*...*/
  default:
    // Unexpected type! Someone introduced a new type and didn't update this.
    throw new IllegalStateException("Unknown type "+this._someType); 
}
36
Igor Lankin

Vous devriez lancer InvalidOperationException pour indiquer qu'un objet a un état invalide.

De la documentation MSDN (lien ci-dessus):

L'exception levée lorsqu'un appel de méthode n'est pas valide pour l'état actuel de l'objet.

39
Matthew Watson

L'analogue le plus proche que je puisse comprendre à partir de .NET 2.0 [quelque chose de mieux aurait pu être ajouté depuis] serait ObjectDisposedException, ce qui indique qu'un objet a été placé dans un état de validité permanente . Une telle exception peut être considérée comme "inattendue", mais c'est une bonne chose, car la condition qu'elle indique serait également inattendue. En outre, si une méthode sur un objet découvre que son état est invalide, elle doit, après avoir capturé autant d'informations sur l'état de l'objet qu'il peut être utile en cas de dépannage, placer délibérément l'objet dans un état invalide de manière à ce que toutes les opérations futures une exception (à part peut-être une demande d’extraire les informations saisies à des fins de dépannage) lancera une exception.

En raison de la forte association entre IDisposable et ObjectDisposedException, il peut être préférable de définir un nouveau type d'exception qui peut ou non hériter de ObjectDisposedException. On peut soutenir que ObjectDisposedException aurait dû être dérivé de ObjectInvalidatedException, qui devrait également avoir CorruptObjectDiscoveredException et CorruptObjectInvalidatedException bien sûr que ça compte vraiment.

Le plus important, à mon avis, est de garantir que le code qui a des raisons de croire qu'un objet peut être corrompu invalide expressément l’objet. Certaines personnes ont suggéré que les méthodes permettant de découvrir des problèmes imprévus tentent de détruire l'ensemble du système. Je suis fortement en désaccord avec cette philosophie. Si une méthode place un objet dans ce qui est supposé être un état temporairement corrompu, puis quitte via une exception avant que l'état de l'objet ne puisse être corrigé, elle doit invalider complètement l'objet au lieu de le laisser corrompu. Si après le déchargement de la pile, le système ne peut pas fonctionner sans l'objet maintenant invalidé, il s'effondrera rapidement (une meilleure alternative que de fonctionner avec un état corrompu). Si, toutefois, le processus de déroulement de la pile entraîne l'abandon de l'objet endommagé (par exemple, quelqu'un a essayé de charger un document à partir d'un fichier de type incorrect, provoquant une exception dans une méthode appelée par LoadDocument), l'objet abandonné était corrompu peut être une information utile pour comprendre pourquoi une exception a été générée, mais peut n'avoir aucune implication défavorable pour la santé générale du système.

0
supercat