Ogólny dekorator do zawijania prób z wyjątkiem pythona?

Współpracowałem z dużą ilością głęboko zagnieżdżonego jsona, którego nie napisałem, i chciałbym, aby mój skrypt Pythona był bardziej „wybaczający” na nieprawidłowe dane wejściowe. Uważam, że piszę zaangażowane bloki try-except i wolę po prostu zawinąć wątpliwą funkcję.

Rozumiem, że złym rozwiązaniem jest połknięcie wyjątków, ale wolałbym, żeby później były drukowane i analizowane, niż żeby faktycznie przestały być wykonywane. Jest bardziej wartościowy, w moim przypadku użycia, aby kontynuować wykonywanie w pętli, niż uzyskać wszystkie klucze.

Oto co robię teraz:

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'] = ''

Oto, co chciałbym (1):

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

lub (2):

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

... gdzie mogę zawinąć pojedynczy element danych (1) lub funkcję master (2), w jakiejś funkcji, która zamienia wyjątki zatrzymania wykonania w puste pola, drukowane na standardowe wyjście. Pierwszy z nich byłby czymś w rodzaju pomijania przedmiotów - tam, gdzie ten klucz nie jest dostępny, loguje się pusty i przechodzi dalej - ten drugi jest pomijaniem wierszy, gdzie jeśli którekolwiek z pól nie działa, cały rekord jest pominięty.

Rozumiem, że jakiś rodzaj opakowania powinien być w stanie to naprawić. Oto, co próbowałem, z opakowaniem:

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

Oto dlaczego to nie działa. Wywołaj funkcję, która nie istnieje, nie próbuje jej złapać:

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

Zanim jeszcze dodam pustą wartość zwracaną, chciałbym ją poprawnie wypróbować. Gdyby ta funkcja zadziałała, wydrukowałoby to „Błąd”, prawda?

Czy funkcja owijania jest tutaj właściwym podejściem?

AKTUALIZACJA

Miałem wiele naprawdę przydatnych, pomocnych odpowiedzi poniżej i dziękuję za nie --- ale edytowałem przykłady, których użyłem powyżej, aby zilustrować, że próbuję złapać więcej niż zagnieżdżone błędy kluczowe, że m szukam funkcji, która zawija try-catch dla ...

Kiedy metoda nie istnieje.Gdy obiekt nie istnieje, i wywołuje na nim metodę.Gdy obiekt, który nie istnieje, jest wywoływany jako argument funkcji.Dowolna kombinacja którejkolwiek z tych rzeczy.Bonus, gdy funkcja nie istnieje.

questionAnswers(8)

yourAnswerToTheQuestion