2016-01-14 1 views
1

Est-ce qu'il y a un moyen dans python (fonction intégrée ou quelque chose) de vérifier si une exécution de fonction échoue en raison d'une erreur ou fonctionne? Et revenir soit vrai ou faux, selon le cas, il estTrue si une fonction fonctionne et false si une fonction donne une erreur

Exemple de ce que je compterais arriver:

Exemple de méthode Builtin: iserror

iserror(float('123')) #returns False, as no error on float('123') occurs 
iserror(float('as1f')) #returns True, as it is not possible to convert to float the string ('as1f') 
+0

qu'en est-il de 'try: function(); out = Vrai; sauf: out = False'? – tglaria

+0

Voilà à quoi sert un bloc d'essai, cela ne fonctionnera-t-il pas pour votre cas d'utilisation? Pour que quelque chose comme ça fonctionne, vous devriez envelopper l'appel de fonction dans un Lamda, de toute façon. – nephets

+1

Semble que vous voulez lire un peu sur la gestion des exceptions. python 2: https://docs.python.org/2/tutorial/errors.html python 3: https://docs.python.org/3/tutorial/errors.html – finalman

Répondre

1

Il n'y a pas une telle fonction. Vous ne pouvez pas construire une fonction qui fait ce que vous demandez, car au moment où Python appelle iserror(), l'expression float('123') ou float('as1f') a déjà été déjà exécutée; Si une exception est générée, iserror() n'est jamais exécutée.

Il faudrait déléguer l'appel à la fonction:

def iserror(func, *args, **kw): 
    try: 
     func(*args, **kw) 
     return False 
    except Exception: 
     return True 

utiliser ensuite comme ceci:

iserror(float, '123') # False 
iserror(float, 'as1f') # True 

attraper toutes les erreurs est pas terrible mais une idée. Bien que la fonction ci-dessus essaie de faire la bonne chose en attrapant Exception (et évite ainsi d'attraper SystemExit ou KeyboardInterrupt), va attraper MemoryError, ce qui indique que vous avez manqué de mémoire, pas que les arguments de la fonction que vous avez testés étaient faux!

Toujours essayer d'attraper spécifiques exceptions; vous pouvez étendre iserror() prendre une exception:

def iserror(func, *args, **kw): 
    exception = kw.pop('exception', Exception) 
    try: 
     func(*args, **kw) 
     return False 
    except exception: 
     return True 

alors seul hic ValueError pour tester vos appels float():

iserror(float, '123', exception=ValueError) # False 
iserror(float, 'as1f', exception=ValueError) # True 

Ce n'est plus lisible que tout. Je voudrais coller avec un simple try..except en ligne où vous voulez utiliser un appel de fonction qui pourrait déclencher une exception, car alors vous pouvez adapter votre réponse à l'exception spécifique sans avoir à vous répéter pour gérer le résultat après avoir déterminé qu'il a gagné t être une erreur:

while True: 
    value = raw_input('Please give a number: ') 
    try: 
     value = int(value) 
     break 
    except ValueError: 
     print "Sorry, {} is not a valid number, try again".format(value)