Python (pylint):在验证过程中捕获通用异常
大家都知道,在Python中,通常不应该捕获通用异常,除非在非常少见的情况下。不过,关于什么情况算是“非常少见”,却没有太多建议。
我想讨论的场景是,一个函数通过调用多个函数来验证某个目标对象。如果这些函数抛出错误,那就说明这个对象不合法。
在我的例子中,我想确认一个.json文件确实是有效的json格式。它大概是这样的:
def validate_json(file_path: str):
try:
with open(file_path) as f:
json.load(f)
except Exception:
return False
return True
def list_json_files(root_dir: str):
return [file for file in glob.glob(root_dir + "*.json") if validate_json(file)]
需要注意的是,我并没有测试上面的代码(我只是快速写的,用来说明这个场景)。在很多类似的情况下,似乎没有必要去追踪所有可能在验证某个对象时发生的异常。捕获特定的异常也会让代码在将来变得不那么灵活,比如如果外部库添加了一个新的异常,可能会被抛出。
我之所以对这个用例感兴趣,是因为在我看来,这并不算特别罕见,但却从来没有被提到过。
更重要的是,作为一个pylint的用户,我不得不处理那些烦人的宽泛异常捕获警告,而我又不想在代码里到处加上#pylint: disable...
。
我想问的是:这是捕获通用异常的合理理由吗?如果不是,那有什么更好的方法来解决这个问题,特别是能让pylint满意的方式?
1 个回答
2
你的例子可能比你想象的还要有教育意义!
确实,有时候你可能想要捕捉所有的错误,这种时候你可能会抱怨pylint太过挑剔,就像个唠叨的保姆。不过,它其实是在提醒你,问你是否真的确定不想更具体一点。
但是在你的validate_json函数中,如果你拼错了文件名,或者没有权限读取这个文件呢?这时候你可能会认为手上的JSON是无效的,但如果有一个未处理的FileNotFoundError或PermissionError,就能告诉你真正的问题出在哪里。