39 votes

Est-il préférable d'utiliser une exception ou un code de retour en Python?

Vous savez peut-être cette recommandation de Microsoft à propos de l'utilisation des exceptions dans .NET:

Facteurs De Performance

...

Lancer des exceptions uniquement pour conditions extraordinaires, ...

En outre, ne pas lever une exception lorsqu'un code de retour est suffisant...

(Voir l'ensemble du texte à http://msdn.microsoft.com/en-us/library/system.exception.aspx.)

Comme point de comparaison, recommanderiez-vous la même chose pour le code Python?

36voto

codeape Points 38576

La chose pythonique à faire est de soulever et de gérer des exceptions. L'excellent livre "Python en quelques mots" en parle dans le chapitre "Stratégies de vérification des erreurs" du chapitre 6.

Le livre discute de EAFP ("il est plus facile de demander pardon que la permission") contre LBYL ("regarde avant de sauter").

Donc, pour répondre à votre question:

Non, je ne recommanderais pas la même chose pour le code python. Je vous suggère de lire le chapitre 6 de Python en quelques mots .

11voto

jammycakes Points 2999

La meilleure façon de comprendre les exceptions est "si votre méthode peut pas faire ce que son nom l'indique, il n', de les jeter." Mon opinion personnelle est que ces conseils doivent être appliquées de manière égale à tous les deux .NET et Python.

La principale différence est l'endroit où vous avez des méthodes qui peuvent souvent pas faire ce que leur nom indique qu'ils devraient faire, par exemple, l'analyse de chaînes que des entiers, ou de la récupération d'un enregistrement à partir d'une base de données. Le C# style est à éviter une exception levée en premier lieu:

int i;
if (Int32.TryParse(myString, out i)) {
    doWhatever(i);
}
else {
    doWhatever(0);
}

alors que Python est beaucoup plus à l'aise avec ce genre de chose:

try:
    i = int(myString)
except ValueError:
    i = 0
doWhatever(i);

8voto

googletorp Points 22395

En Python, les exceptions ne coûtent pas très cher, contrairement à d'autres langages. Je vous déconseille donc d'éviter les exceptions. Mais si vous lancez une exception, vous voudrez généralement qu'elle soit capturée quelque part dans votre code, à l'exception des cas d'erreur fatale.

8voto

Roberto Liffredo Points 15265

Généralement, Python est orientée vers l'expressivité.
J'applique le même principe ici: généralement, vous vous attendez à une fonction pour retourner un résultat (en ligne avec son nom!) et pas un code d'erreur.
Pour cette raison, il est généralement mieux de lever une exception, en plus de retourner un code d'erreur.

Cependant, ce qui est indiqué dans l'article MSDN s'applique à Python, et ce n'est pas vraiment connecté à retourner un code d'erreur au lieu d'une exception.
Dans de nombreux cas, vous pouvez voir l'exception de manipulation utilisées pour le contrôle de flux, et pour le traitement devrait situations. Dans certains milieux, cela a un impact énorme sur les performances; dans tous les environnements, il a un grand impact sur le programme de l'expressivité et de la maintenabilité.

Les Exceptions sont pour exceptionnelle des situations, qui sont à l'extérieur de la normale de flux de programme; si vous attendez quelque chose va se passer, alors vous devez gérer directement, puis de relancer quelque chose que vous ne pouvez pas attendre / poignée.

Bien sûr, ce n'est pas une recette, mais seulement une heuristique; la décision finale est toujours au développeur et sur le contexte et ne peut pas être déclaré dans un ensemble fixe de lignes directrices - et c'est beaucoup plus vrai pour la gestion des exceptions.

3voto

flow Points 96

Je pense que si, pour renvoyer un code d'erreur ou lever une exception est quelque chose de très valable à penser, et une inter-comparaison linguistique peut être utile et instructif. Je suppose que la très généralisée réponse à cette préoccupation est tout simplement la contrepartie: que le cadre juridique valeurs de retour pour n'importe quelle fonction doit être aussi petite que possible, et aussi grand que nécessaire.

Généralement, cela signifie que si une méthode renvoie un nombre entier dans un seul cas de test, les utilisateurs peuvent légitimement s'attendre à la méthode de toujours renvoyer un nombre entier ou lever une exception. Mais, bien sûr, la conceptuellement plus simple chemin n'est pas toujours la meilleure façon de traiter les choses.

Le retour-valeur-de-moins-surprise est habituellement None; et si vous regardez, vous verrez que c'est la sémantique de l' None de la licence de son utilisation à travers le conseil d'administration: il est un singleton, valeur immuable que, dans beaucoup de cas, évalue False ou interdit en outre de calcul-pas de concaténation, pas de l'arithmétique. Donc, si vous avez choisi d'écrire un frob(x) méthode qui renvoie un nombre en une chaîne de caractères d'entrée, et None pour les non-chaînes numériques et d'autres données, et vous l'utiliser à l'intérieur d'une expression comme a=42+frob('foo'), vous obtenez toujours une exception très près du point où bidon de choses qui s'est passé. Bien sûr, si vous avez des trucs frob('foo') dans une colonne de base de données qui n'a pas été défini avec NOT NULL, vous risquez de rencontrer des problèmes voire des mois plus tard. Cela peut ou peut ne pas être justifiable.

Donc, dans la plupart des cas où, par exemple, vous voulez en tirer un certain nombre à partir d'une chaîne, à l'aide de somwething comme un nu - float(x) ou int(x) est le chemin à parcourir, comme ces built-ins va lever une exception lorsqu'il n'est pas donné une digeste entrée. Si cela ne convient pas à votre cas d'utilisation, envisager de revenir None à partir d'une méthode personnalisée; en général, cette valeur de retour indique aux consommateurs que " Désolé, j'ai été incapable de comprendre votre entrée.'. Mais vous ne voulez faire cela que si vous positivement savoir qui se passe dans votre programme ne fait sens à partir de ce point.

Vous voyez, je viens de trouver comment l'activer chaque avis, avertissement et le message d'erreur en un show-arrêt exception dans, euh, PHP. Il me rend folle qu'une faute de frappe dans le nom d'une variable génère dans le standard de configuration de PHP, rien, mais un préavis à l'utilisateur. C'est donc mauvais. Le programme va juste faire les choses avec un code de programme qui ne fait pas de sens! Je ne peux pas croire que des gens trouve cette fonctionnalité.

De même, on devrait l'afficher comme ceci: si, à un moment donné dans le temps, il peut être affirmé avec des coûts raisonnables que l'exécution d'un morceau de code n'a pas plus de sens, puisque les valeurs sont manquantes, il est hors de question, ou sont d'un type inattendu, ou lorsque les ressources comme une connexion de base de données sont allés vers le bas - il est impératif, afin de minimiser le débogage des maux de tête, de briser l'exécution et de contrôle de la main jusqu'à tout niveau dans le code qui se sent le droit de gérer l'incident.

L'expérience montre qu'en s'abstenant de début de l'action et en permettant à de fausses valeurs à glisser dans vos données est bon à rien, mais de rendre votre code plus difficile à déboguer. Il en est de nombreux exemples de trop zélé de conversion de type: permettant entiers pour être ajouté à la flotte est raisonnable. Pour permettre une chaîne avec rien, mais les chiffres pour être ajouté à un nombre est un faux pratique susceptible de créer d'étranges unlocalized les erreurs qui peuvent apparaître sur toute la ligne qui se trouve être le traitement des données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X