Python - handle one exception in multiple ways
我看过这个问题的常用搜索引擎。我有一种异常需要以不同的方式处理,因为不同的警告不是定期的,并且没有相同的文档布局,我已经自动化了一段时间的网站。
我正在使用的解决方案是在网站上显示警告时评论和解除代码的某些部分。
它总是给我
1 2 3 4 5 6 7 | While True: try: #some code except ElementNotVisibleException: #code to handle error1 except ElementNotVisibleException: #code to handle error2 that will never be procesed |
嵌套
1 2 3 4 5 6 7 8 9 10 | While True: try: #some code break except ElementNotVisibleException: try: #code to handle error1 break except: #code to handle error2 |
所以,我的问题是,有没有其他方法来处理多种方式的异常,一种更加pythonic的方式?
谢谢
编辑:进一步解释我打算做什么。
假设必须导航一些菜单,但是在菜单出现之前会出现一些站点警报,在这种情况下我们将其称为warning1,warning2和警告3.在这种情况下,由于警告使该菜单不可见,脚本将中断。
警告1:将有一个继续按钮,并在同一帧中。
警告2:将弹出一些带有复选框和按钮的叠加层(具有不同的占位符,id和xpath)
Warning3:将与warning1几乎相同,但具有不同的id,name和xpath。
但是所有这些都会抛出
编辑2:@JeffC的答案得到了正确的想法,并将其与@CoryKramer的这个答案相结合,使其更适合我提出的新人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def not_visible_handler(): ls_handlers = [warnin1_hanlder, warnin2_hanlder, warnin3_hanlder] def warnin1_hanlder(): #code to handle warning 1 return True def warnin2_hanlder(): #code to handle warning 2 return True def warnin3_hanlder(): #code to handle warning 3 return True for handler in ls_handlers: if handler() is True: break else: #this else belongs to the for raise Exception('No more Handlers for warning messages') while True: try: #some code break except ElementNotVisibleException: not_visible_handler() |
它足够直接,因此它们不会触及实际工作代码,并且可以轻松添加更多处理程序。还可以将一点点工作变成一个模块。
Edit3:列表中函数的名称不能是字符串,否则将得到
我认为你真的不需要捕获多个异常。 例外情况是一样的,原因是不同的。 原因与存在哪种警告有关。 我会捕获异常,然后继续确定哪个警告导致异常。 您可以通过查找warning1,warning2和warning3标准的元素来完成此操作。 一旦找到属于特定警告的元素,就可以处理它。 下面的代码概述了这种方法。 我不知道不同场景的定位器,因此您需要添加特定的find方法和定位器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | While True: try: #some code except ElementNotVisibleException: #code to handle warning1 if (len(driver.find_elements_by_*(warning1_locator)) > 0) #handle warning1 case #code to handle warning2 if (len(driver.find_elements_by_*(warning2_locator)) > 0) #handle warning2 case #code to handle warning3 if (len(driver.find_elements_by_*(warning3_locator)) > 0) #handle warning3 case |