【问题标题】:Python - handle one exception in multiple waysPython - 以多种方式处理一个异常
【发布时间】:2018-08-09 13:09:33
【问题描述】:

我已经查看了这个问题的常用搜索引擎。我有一种异常需要以不同的方式处理,因为不同的警告不是周期性的并且没有相同的文档布局,在我已经自动化的网站上。 我目前使用的解决方案是在网站上出现上述警告时注释和取消部分代码。

它总是给我ElementNotVisibleException,但是对于同一个错误有两个例外是行不通的,因为它将由第一个例外处理

While True:
    try:
        #some code
    except ElementNotVisibleException:
        #code to handle error1
    except ElementNotVisibleException:
        #code to handle error2 that will never be procesed

嵌套try...except 块似乎太讨厌了。因为当处理失败时,这将是由于其他异常NoSuchElementException,而仅使用except 似乎也不正确,因为它可以隐藏失败的真正原因

While True:
    try:
        #some code
        break
    except ElementNotVisibleException:
        try:
            #code to handle error1
            break
        except:
            #code to handle error2

所以,我的问题是,有没有其他方法可以处理多种方式的异常,一种更 Python 的方式?

谢谢

编辑:进一步解释我打算做什么。

假设必须导航一些菜单,但就在菜单出现之前,一些站点警报出现,在这种情况下,我们将其称为警告 1、警告 2 和警告 3。在这种情况下,由于警告导致脚本中断看不见这个菜单。

警告1:将有一个继续按钮并且在同一帧中。

Warning2:将弹出带有复选框和按钮(具有不同的占位符、id 和 xpath)的覆盖层

Warning3:与 warning1 几乎相同,但 id、name 和 xpath 不同。

但他们都会抛出ElementNotVisibleException。所以它们都不能以同样的方式处理,并且可能会出现警告N(这个脚本很旧,就像两年前一样),我真的不想花太多时间在它上面,因为我可能是在我的职业生涯中摆脱这一点,并希望将其保留为可读和明确的,以供即将担任该职位的小伙子使用。所以这个人可以去添加更多的代码来克服新的警告信息。

EDIT2:@JeffC 的回答得到了正确的想法,并将其与@CoryKramer 的This answer 结合起来,让我想出的新人更容易接受:

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:列表中的函数名不能是字符串,否则会得到TypeError: 'str' type is not callable

【问题讨论】:

  • 你的意思是你想用不同的日志处理两个ElementNotVisibleExceptions中的每一个?可以分享一些真实的代码和真实的异常日志吗?
  • 用英语(不是代码)描述你遇到这种情况的典型场景以及在每种情况下你想做什么。
  • @JeffC 添加了一些场景来进一步解释自己
  • @Andersson 不能,它有一些明智的信息。但我可以告诉你的是,代码对页面本身没有问题。当网站上出现一种新的警告时,它会刹车,如果是旧警告,它会得到很好的处理。
  • 您希望如何处理每个警告警报?这些警报是什么?他们只是div 节点吗?

标签: python-3.x selenium exception web-scraping


【解决方案1】:

我认为您确实不需要捕获多个异常。例外是一样的,原因是不同的。原因与存在的警告有关。我会捕获异常,然后继续确定是哪个警告导致了异常。您可以通过定位warning1、warning2 和warning3 的标准元素来做到这一点。一旦找到属于特定警告一部分的元素,就可以处理它。下面的代码概述了这种方法。我不知道不同场景的定位器,因此您需要添加特定的查找方法和定位器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多