Python 3.x Python-以多种方式处理一个异常
我已经在搜索引擎中找到了这个问题。我有一种异常需要以不同的方式处理,因为不同的警告不是周期性的,并且没有相同的文档布局,在我不久前自动化的网站上。 我目前使用的解决方案是,当网站上出现上述警告时,对代码的某些部分进行注释和删除 它总是给我Python 3.x Python-以多种方式处理一个异常,python-3.x,selenium,exception,web-scraping,Python 3.x,Selenium,Exception,Web Scraping,我已经在搜索引擎中找到了这个问题。我有一种异常需要以不同的方式处理,因为不同的警告不是周期性的,并且没有相同的文档布局,在我不久前自动化的网站上。 我目前使用的解决方案是,当网站上出现上述警告时,对代码的某些部分进行注释和删除 它总是给我元素NotVisibleException,但是对于同一个错误有两个异常是不起作用的,因为它将由第一个异常处理 While True: try: #some code except ElementNotVisibleExcepti
元素NotVisibleException
,但是对于同一个错误有两个异常是不起作用的,因为它将由第一个异常处理
While True:
try:
#some code
except ElementNotVisibleException:
#code to handle error1
except ElementNotVisibleException:
#code to handle error2 that will never be procesed
嵌套try…除了block看起来太糟糕了。因为当处理失败时,它将是由其他异常引起的NoSuchElementException
,而仅仅使用except
似乎也不正确,因为它可以隐藏失败的真正原因
While True:
try:
#some code
break
except ElementNotVisibleException:
try:
#code to handle error1
break
except:
#code to handle error2
所以,我的问题是,有没有其他的方法来处理多重方式上的异常,一种更具python风格的方式
谢谢
编辑:进一步解释我打算做什么
假设必须导航一些菜单,但就在菜单出现之前,一些站点警报出现,在这种情况下,我们将其称为warning1、warning2和Warning3。在这种情况下,由于警告使此菜单不可见,脚本将中断
警告1:将有一个“继续”按钮,并且位于同一帧中
警告2:将是一个带有复选框和按钮(带有不同的占位符、id和xpath)的覆盖的弹出窗口
警告3:与警告1几乎相同,但id、名称和xpath不同
但是它们都会抛出一个元素notvisibleexception
。因此,所有这些都不能以相同的方式处理,可能warningN会超时出现(这个脚本很旧,大概有两年了),我真的不想在它上花费太多时间,因为我可能会在我的职业生涯中离开它,并希望它为即将担任该职位的人留下可读性和明确性。所以这家伙可以去添加一些代码来克服新的警告信息
EDIT2:@JeffC的答案得到了正确的想法,并将其与@CoryKramer的答案结合起来,使之更适合新来的家伙我想到了以下几点:
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”类型不可调用
我认为您不需要捕获多个异常。例外是一样的,原因是不同的。原因与出现的警告有关。我将捕获异常,然后继续确定导致异常的警告。您可以通过定位warning1、warning2和warning3的标准元素来实现这一点。一旦找到属于特定警告的元素,就可以处理它。下面的代码概述了这种方法。我不知道不同场景的定位器,因此您需要添加特定的find方法和定位器
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
我不认为您真的需要捕获多个异常。例外是一样的,原因是不同的。原因与出现的警告有关。我将捕获异常,然后继续确定导致异常的警告。您可以通过定位warning1、warning2和warning3的标准元素来实现这一点。一旦找到属于特定警告的元素,就可以处理它。下面的代码概述了这种方法。我不知道不同场景的定位器,因此您需要添加特定的find方法和定位器
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
您的意思是想用不同的日志处理两个ElementNotVisibleException
s中的每一个吗?你能分享一些真实的代码和真实的异常日志吗?用英语(而不是代码)描述一个你遇到这种情况的典型场景,以及在每种情况下你想做什么。@JeffC添加了一些场景来解释我自己more@Andersson不行,它有一些合理的信息。但是我可以告诉你的是,代码本身没有问题。当一种新的警告出现在网站上时,它会刹车,如果是旧的警告,它会得到很好的处理。您希望如何处理每个警告警报?这些警报是什么?它们只是div
节点吗?您的意思是要用不同的日志处理两个ElementNotVisibleException
s中的每一个节点吗?你能分享一些真实的代码和真实的异常日志吗?用英语(而不是代码)描述一个你遇到这种情况的典型场景,以及在每种情况下你想做什么。@JeffC添加了一些场景来解释我自己more@Andersson不行,它有一些合理的信息。但是我可以告诉你的是,代码本身没有问题。当一种新的警告出现在网站上时,它会刹车,如果是旧的警告,它会得到很好的处理。您希望如何处理每个警告警报?这些警报是什么?它们只是div
节点吗?