Генеральный декоратор, чтобы обернуть попробовать, кроме как в Python?

Я взаимодействовал со многими глубоко вложенными json, которые я не писал, и хотел бы сделать мой скрипт на python более «прощающим» неверный ввод. Я нахожу себя пишущим блоки try-кроме, и я бы предпочел просто завернуть сомнительную функцию.

Я понимаю, что это плохая политика - проглатывать исключения, но я бы предпочел, чтобы они печатались и анализировались позже, чем фактически останавливать выполнение. В моем сценарии использования более ценно продолжать выполнение по циклу, чем получать все ключи.

Вот что я делаю сейчас:

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

Вот что я хотел бы, (1):

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

или (2):

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

... где я могу обернуть либо отдельный элемент данных (1), либо главную функцию (2) в какую-то функцию, которая превращает исключения, прерывающие выполнение, в пустые поля, выводимые на стандартный вывод. Первый будет как бы поэтапным пропуском - там, где этот ключ недоступен, он записывается пустым и движется дальше - вторым является пропуск строки, где, если какое-либо из полей не работает, вся запись пропускаются.

Насколько я понимаю, какая-то обертка должна быть в состоянии это исправить. Вот что я попробовал с оберткой:

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

Вот почему это не работает. Вызовите функцию, которая не существует, она не пытается ее отловить:

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

Еще до того, как я добавлю пустое возвращаемое значение, я бы хотел, чтобы оно правильно попробовало. Если бы функция работала, это напечатало бы «Ошибка», правильно?

Является ли здесь функция-обертка правильным подходом?

ОБНОВИТЬ

У меня было много действительно полезных и полезных ответов ниже, и спасибо за них - но я отредактировал примеры, которые я использовал выше, чтобы проиллюстрировать, что я пытаюсь поймать больше, чем вложенные ключевые ошибки, что я ' Я специально искал функцию, которая оборачивает try-catch для ...

Когда метод не существует.Когда объект не существует и получает метод, вызываемый для него.Когда объект, который не существует, вызывается в качестве аргумента функции.Любая комбинация любой из этих вещей.Бонус, когда функция не существует.

Ответы на вопрос(8)

Ваш ответ на вопрос