【发布时间】:2021-08-07 01:45:12
【问题描述】:
我会与很多我没有编写的深度嵌套的 json 进行交互,并且想让我的 python 脚本对无效输入更加“宽容”。我发现自己在编写涉及 try-except 块,而宁愿将可疑的函数包装起来。
我知道吞下异常是一个糟糕的策略,但我宁愿稍后打印和分析它们,而不是实际停止执行。在我的用例中,继续循环执行比获取所有键更有价值。
这是我现在正在做的事情:
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 的函数。
- 当方法不存在时。
- 当一个对象不存在,并且正在获取对其调用的方法时。
- 当一个不存在的对象作为函数的参数被调用时。
- 这些东西的任意组合。
- 奖励,当函数不存在时。
【问题讨论】:
-
对于专门访问嵌套 JSON,您可能需要查看 safeJSON。这是通过有效地包装对象
myobject来实现的。
标签: python try-catch wrapper decorator