Python 异常处理风格

2020-11-20 12:21:00 +08:00
 bbxiong

selenium api 基本全都会抛异常

比如

if driver.find_element_by_class_name("general-error"): print("登录错误")

必须要写成如下 try: if driver.find_element_by_class_name("general-error"): print("登录错误") except: pass

所有常用 api 都会抛出异常,每个 find_element_by_xxx 都必须放在 try except 封装成函数,显得代码臃肿不堪...

是不是我的风格有问题,请教下大家都怎么处理这种情况的.

2416 次点击
所在节点    Python
8 条回复
imn1
2020-11-20 12:32:26 +08:00
这种情况我选择换个写法,例如其他模块

实际上我都没用过 selenium api,都不知道会抛出异常,我是获取 content 然后用其他 parser 模块处理的

如果不可避免非要用某个模块,它又容易抛出异常,我会写个类继承过来,或者闭包,把异常集中处理
happinessnch
2020-11-20 12:37:47 +08:00
异常处理,和业务逻辑没有关系,咋一看好像很臃肿,好多地方要 try catch,
实际上异常处理多了慢慢也就习惯了,根据不同异常做一些定制化的处理,
绝大多数异常是不应该直接 pass 的,但是实际开发时,每个异常都处理确实有点过于苛求了。
no1xsyzy
2020-11-20 14:25:40 +08:00
这个是设计问题,不过你这边似乎也可以更正交地抽象

def finds(driver, **kwargs):
   try:
     return driver.find_element(...) # TODO: implement it
   except:
     return None

这样的话你以后就可以
if finds(driver, class_name="loaderIcon"):
  ...
elif finds(driver, class_name="ut-tab-bar"):
  ...
...
no1xsyzy
2020-11-20 14:28:58 +08:00
@happinessnch BTW 如果逻辑上确实应不处理,我推荐 with contextlib.suppress
如果暂时不作处理,我推荐 except: pass # TODO: handle this
bbxiong
2020-11-20 15:13:14 +08:00
@no1xsyzy 这种设计方式用起来比较方便,其实我奇怪的为啥 selenium 设计这些 api 要抛异常,而不是找不到返回 None
imn1
2020-11-20 15:24:16 +08:00
@bbxiong #5
模块一般是通用的,泛考虑

例如某个 exif 模块,里面严格执行 exif 规范,dump 的时候一个值错了就会抛异常
本来 exif 有几百条,一条错误并不影响其他读取,也不影响图片本身显示,批量处理(上千个图片)遇到错误可以跳过就行了,逐个处理异常确实麻烦
但人家按照规范做,也不能说人家做错了,因为遵守规范总是正确立场,只能自己继承修改以适应自己的需求
no1xsyzy
2020-11-20 22:38:38 +08:00
@bbxiong 发现我可能单位写了一堆忘了发……
应该它的这些 API 就是设计为链式调用的,那显然报一个“元素找不到”的错比“NoneType 没有此属性”的错更合理。
不过,我设计的话会设计两套 API,一个更简洁的引发异常,更啰嗦的给 None,形如 dct['key'] v.s. dct.get('key')
或者提供一个参数来表示默认值,不提供就引发异常,形如 dct.pop('key', None) v.s. dct.pop('key')
peckey
2020-11-25 19:24:09 +08:00
find_elements_by_xxx 不会抛出异常

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/727483

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX