连续尝试/除外块的替代方法

时间:2018-06-27 23:52:34

标签: python error-handling try-catch

我对Python还是很陌生,所以我想知道是否有比运行大量连续try/except块更简洁的选择,如下所示?

try:
    project_type = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-type")]').text
except Exception:
    project_type = 'Error'
try:
    title = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-title")]').text
except Exception:
    title = 'Error'
try:
    description = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-description")]').text
except Exception:
    description = 'Error'
try:
    category = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-category")]').text
except Exception:
    category = 'Error'
...

正如this threadthis thread,中所建议的,我想我可以创建变量名和查询的列表,然后使用for循环为每个容器项目构造一个字典,但是真的没有其他替代方法可能更具可读性吗?

2 个答案:

答案 0 :(得分:2)

代码混乱的原因是因为您有重复的代码。您要连续四次表达相同的想法(查找值,如果失败则设置默认值),这自然意味着您也必须编写四次相同的支持代码。

循环是修复重复代码的好方法-因此,使用名称列表查找和创建值字典是您的理想解决方案。这样,您便可以一次编写逻辑,然后多次使用。

(另外:您的代码重复导致bug!前两个try-except块将'Error'的值分配给description而不是适当的变量。重复的代码会咬人!)

答案 1 :(得分:1)

您可以抽象对find_element_by_xpath的呼叫;这样可以避免代码重复,并使代码更具可读性:

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'

然后您的代码变为:

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...