【问题标题】:How to combine multiple try-except blocks?如何组合多个 try-except 块?
【发布时间】:2021-01-14 21:54:28
【问题描述】:

我有一堆语句要使用 try,除了 on。是的,不好的做法。

下面一定有更pythonic的写法吧?

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
except AttributeError:
    E1=None

try:
    E2=clean_html.find("span",{"class":"range-b"}).text 
except AttributeError:
    E2=None

try:
    E3=clean_html.find("span",{"class":"range-c"}).text 
except AttributeError:
    E3=None

try:
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    E4=None

因为这段代码对我来说很好用,但看起来效率不高。

【问题讨论】:

  • 您可以创建一个执行此操作的函数,或者一个上下文管理器,但无论您做什么,您都不应该有一个裸露的except:!查看实际的异常是什么并抓住它,例如except IndexError:.
  • 相应调整!

标签: python loops exception try-except


【解决方案1】:

您可以编写一个处理 try 和 except 的函数。如果您希望函数在调用方法时处理 None 抛出错误的问题,您可以将 post_processing 作为 lambda 传递

def get_clean_text(tag, class_name, post_processor):
    try:
        return post_processor(clean_html.find(tag,{"class": class_name}))
    except AttributeError:
        return None

E1 = get_clean_text("span", "range-a", lambda o: o.text)
E4 = get_clean_text("div", "Description", lambda o: o.get_text(separator=" ").strip())

【讨论】:

  • 谢谢,这个答案很有效,并且美化了我的代码! :) 如果属性从类更改为不同的属性,则必须更改函数对吗?
  • 是的,那么您可能需要传递clean_html.find() 的完整第二个参数。
【解决方案2】:

您可以为变量分配默认值,然后执行此操作。由于您希望默认值是不可变的None,因此您可以

E1 = E2 = E3 = E4 = None

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
    E2=clean_html.find("span",{"class":"range-b"}).text 
    E3=clean_html.find("span",{"class":"range-c"}).text 
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    pass

处理异常的最佳方法取决于比我们这里更多的上下文,但通常您希望编写更大的块,以在任何“异常”操作上保持正常状态。

由于异常需要一些处理能力来设置并且可能在视觉上不整洁,因此测试(尤其是包装在自己的函数中时)可能是一种更好的方法。

def get_elem_text(elem, default=None):
    if elem:
        return elem.text
    else:
        return default

E1=get_elem_text(clean_html.find("span",{"class":"range-a"}))
E2=get_elem_text(clean_html.find("span",{"class":"range-b"})) 
E3=get_elem_text(clean_html.find("span",{"class":"range-c"})) 
# I don't know what "get_text" is so can't abstract it
#E4=get_elem_text(clean_html.find("div",{"class":"Description"}), default="")).strip()

【讨论】:

  • 亲爱的 tdelaney,感谢您的回答。我确实考虑过这一点,但是,如果 E1 出错,它将转到异常,而不执行 E2、E3 和 E4。我想执行所有这些
  • @Rivered - 添加了另一种常用方法。
  • 例如,我编写了另一个函数来包含 E4。但实际上,当我想对 get_elem_text 找到的元素进行一些拆分处理时,例如 .split("/")[-1] 它会遇到 TypeError: 'NoneType' object is not callable,因为这是有道理的如果元素不存在,则元素将是 None 。我仍然觉得必须有一种更合乎逻辑的尝试方式,除了
  • 您可以将空字符串设置为默认值,而不是 None 以进行拆分工作。您可以重写get_elem_text 以使用异常而不是测试,但在这种情况下测试会更快一些,并且您会遇到拆分None 的相同问题。修复可能最好在您的处理代码中处理。 if E4: do the split and processing.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多