web-dev-qa-db-fra.com

Quand "Try" est-il censé être utilisé dans les noms de méthode C #?

Nous discutions avec nos collègues de ce que cela signifie si le nom de la méthode commence par "Try".

Il y avait les avis suivants:

  • Utilisez "Try" lorsque la méthode peut renvoyer une valeur nulle.
  • Utilisez "Try" lorsque la méthode ne lèvera pas d'exception.

Quelle est la définition officielle? Que dit "Try" dans le nom de la méthode? Y a-t-il des directives officielles à ce sujet?

170
ms007

Ceci est connu sous le nom de modèle TryParse et a été documenté par Microsoft. La la page officielle des exceptions et performances MSDN indique :

Considérez le modèle TryParse pour les membres qui peuvent lever des exceptions dans des scénarios courants pour éviter les problèmes de performances liés aux exceptions.

Ainsi, si vous avez du code pour lequel un cas d'utilisation normal signifierait qu'il pourrait lever une exception (telle que l'analyse d'un int), le modèle TryParse est logique .

145
Erik Schierboom

(Corrigé) Il y a une directive officielle, comme l'a suggéré Erik.

Quand je vois la méthode TrySomething, je suppose

  • ne jette pas
  • renvoie bool
  • si j'attends de la valeur, elle est retournée via le paramètre 'out'
  • il existe une méthode Something, qui me permet de gérer toute exception moi-même. (modifier, suggéré par Jesse Webb)
116
nothrow

Je pense que vous devriez utiliser try lorsque vous voulez continuer. Peu importe qu'une méthode renvoie une valeur ou non.

Cas 1: s'il retourne bien, vous pouvez procéder d'une manière ou d'une autre.

Cas 2: s'il ne revient pas: il va toujours bien; vous pouvez procéder d'une autre manière.

Et si vous attendez une certaine valeur en sortie de cette méthode, utilisez le paramètre out.

Exemple

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}
7
Ashok Damani

Vous devez utiliser "Try" dans le nom de la méthode, lorsque vous souhaitez manifester le fait que l'invocation de la méthode peut produire un résultat non valide. En suivant la norme .NET, ce n'est d'ailleurs pas une fonction qui déclenche une exception, mais la fonction qui renvoie un VALID ou NON_VALID, du point de vue du programme, valeur.

À la fin, il s'agit de la convention de dénomination que vous décidez d'utiliser dans votre groupe.

6
Tigran

Assurez-vous d'inclure try dans votre nom de méthode si:

  • vous ne jetez aucune exception
  • votre méthode a la signature suivante: bool TrySomething(input, out yourReturn)

Donc, fondamentalement, si nous utilisons les méthodes try-, nous obtenons uniquement un résultat booléen.

Ainsi, le code suivant ne lèvera aucune exception:

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

Alors que ce code peut (et dans ce cas va) lever des exceptions:

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

L'utilisation des méthodes Try est un moyen plus sûr et plus défensif de coder. De plus, l'extrait de code n ° 2 nécessite plus de performances pour s'exécuter s'il ne s'agit pas d'un entier.

5
Fabian Bigler

Oncle Bob donne l'exemple ci-dessous dans son livre Clean Code. Chaque fois que nous nous attendons à ce qu'une exception soit levée, nous pouvons utiliser le préfixe Try pour un nom de méthode:

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

Et puis (adapté):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

La méthode tryToShutDown ne fait aucune gestion d'erreur, car c'est la responsabilité de la méthode sendShutDown.

Le modèle TryParse de Microsoft viole la directive de code propre qui dit que nous devons éviter les paramètres de sortie.

Si nous ne développons pas une nouvelle version de C #, nous n'avons pas à respecter toutes les directives de Microsoft. Parfois, ils ne sont pas les meilleurs.

0
Glauber