我需要与很多深度嵌套的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),使其在执行时如果出现异常就将其转换为空字段,并打印到stdout。前一种情况相当于对每个项目进行跳过,如果该键不可用,则记录空白并继续执行下一个;后一种情况是跳过一整行,如果任何字段无法工作,则跳过整个记录。
我的理解是应该有一种包装器可以解决这个问题。下面是我尝试使用包装器的代码:
def f(func):
def silenceit():
try:
func(*args,**kwargs)
except:
print('Error')
return(silenceit)
以下是为什么它不起作用的原因。调用一个不存在的函数,它不会尝试捕获(try-catch):
这里解释了代码无法正常工作的原因。如果调用一个不存在的函数,代码不会将其捕获并尝试处理:
>>> f(meow())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined
在添加空返回值之前,我希望能够正确地使用try-catch。如果该函数有效,那么会打印“Error”,对吧?
在这里使用包装函数的方式正确吗?
更新
下面有很多非常有用和有帮助的答案,谢谢你们——但我已经编辑了上面的示例,以说明我正在尝试捕获更多嵌套的键错误,而且我特别寻找一个用于包装try-catch的函数,用于...
- 当方法不存在时。
- 当对象不存在时,并且正在调用它的方法。
- 当被调用的函数的参数为不存在的对象时。
- 任何这些事物的任意组合。
- 额外奖励,当函数不存在时。
myobject
来实现。 - BrenBarn