Général décorateur pour envelopper essayer sauf en python?

J'avais l'interaction avec beaucoup de profondément imbriqués json je n'ai pas écrit, et que vous souhaitez faire mon script python plus de "pardonner" à une entrée non valide. Je me retrouve à écrire tentent-à l'exception des blocs, et serait plutôt juste envelopper le douteux fonction.

Je comprends que c'est une mauvaise politique d'avaler des exceptions, mais je préfère préfèrent-ils être imprimés et analysés plus tard, que pour réellement arrêter l'exécution. Il est plus intéressant, dans mon cas d'utilisation de poursuivre l'exécution sur la boucle que pour obtenir toutes les clés.

Voici ce que je fais aujourd'hui:

try:
    item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
    item['a'] = ''
try:
    item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
    item['b'] = ''
try:
    item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
    item['c'] = ''
...
try:
    item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
    item['z'] = ''

Voici ce que j'aimerais, (1):

item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...

ou (2):

@f
def get_stuff():
   item={}
   item['a'] = myobject.get('key').get('subkey')
   item['b'] = myobject.get('key2')
   item['c'] = func1(myobject)
   ...
   return(item)

...où je peux enrouler le seul élément de données (1), ou une fonction de maître (2), dans une fonction qui transforme l'exécution de l'arrêt des exceptions dans des champs vides, imprimé à stdout. L'ancien serait une sorte de point-sage skip - où que la clé n'est pas disponible, il enregistre le vide et se déplace sur - le dernier est une ligne sauter, où si un des champs n'est pas le travail, l'ensemble du dossier est ignorée.

Ma compréhension est que de l'emballage doit être en mesure de résoudre ce problème. Voici ce que j'ai essayé, avec un wrapper:

def f(func):
   def silenceit():
      try:
         func(*args,**kwargs)
      except:
         print('Error')
      return(silenceit)

Voici pourquoi il ne fonctionne pas. Appeler une fonction qui n'existe pas, il n'a pas essayer de l'attraper à l'écart:

>>> f(meow())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined

Avant que je même ajouter un vide valeur de retour, j'aimerais obtenir à essayer de l'attraper correctement. Si la fonction avait travaillé, cela aurait imprimé "Erreur", pas vrai?

Est une fonction wrapper de l'approche correcte ici?

Mise à JOUR

J'ai eu beaucoup de vraiment utile réponses ci-dessous, et vous en remercions---mais j'ai édité les exemples que j'ai utilisé ci-dessus pour illustrer le fait que je suis en train d'essayer d'attraper plus de clé imbriquée des erreurs, que je suis à la recherche spécifiquement pour une fonction qui encapsule un try-catch pour...

  1. Lorsqu'une méthode n'existe pas.
  2. Lorsqu'un objet n'existe pas, et est de trouver une méthode appelée sur elle.
  3. Lorsqu'un objet qui n'existe pas est appelé comme argument à une fonction.
  4. Toute combinaison de l'un quelconque de ces choses.
  5. Bonus, lorsqu'une fonction n'existe pas.
  • Pour accéder imbriquée JSON plus précisément, vous pouvez jeter un oeil à safeJSON. Cela fonctionne en enveloppant l'objet myobject.
InformationsquelleAutor Mittenchops | 2013-03-22