关于python:尝试/除了检查字符串

Try/except to check string

我对如何使用Try/Exceptionif/else感到困惑。如果我想告诉用户提供.html文件,如何编写惯用代码?

1
2
3
4
if url[-4:] ==".html":
        // do your things
else:
    print('Error! the file is not html file')

我正在检查是否应该在这种情况下使用Try/Exception,或者像我那样使用if/else


简而言之:

1
2
try:
    a = q.get()

try的意思是尝试这个东西,如果它起作用,就用它,如果它失败,就用它,否则就用except别的东西,或者它起作用,并且有一个错误,比如ValueError

1
2
except:
    a = None

更新:

1
2
3
4
5
try:
   url[-4:] ==".html"

except:
    print"Error"


在python中,请求宽恕比请求允许更容易。换句话说,python中的惯用方法就是让异常被抛出并做出相应的反应,而不是显式地检查条件("look before you leap",也在链接的词汇表中)。所以您的代码应该如下所示:

1
2
3
4
try:
    # do your thing with `url`
except:
    print('Error! the file is not html file')


如果希望文件名以".html"结尾,则可以使用if进行测试。

如果希望冒泡出一个异常并在上面几级代码处捕获它,也可以使用断言:

1
assert url.lower().endswith(".html"), u"the file name must end in .html"

它只是用于以下目的的句法糖分:

1
2
3
4
if url.lower().endswith(".html"):
    do_your_things_with_url(url)
else:
    raise YourCustomException('the url must end in".html"')

当然,用以下方法取代一个简单的if测试是愚蠢的:

1
2
3
4
5
6
try:
    assert url.lower().endswith(".html")
except AssertionError:
    print('Error! url does not end in".html"')
else:
    do_your_things_with_url(url)

因此,在回答您的问题时,如果字符串以".html"结尾,您可能应该使用if测试进行测试。

PS:这种样式被称为lbyl(在跳跃之前先看一下),在Python中它没有任何问题。另一种选择是EAFP(请求宽恕比请求允许更容易)。这两种方法都可以,并且在大多数情况下都被认为是惯用的,但也有一些例外(例如duck类型,EAFP样式明显优于使用hasattr和/或isinstance的lbyl测试)。如果lbyl相对便宜,不要过度使用eafp—如果便宜的测试可以工作,为什么要尝试昂贵的操作?


与其检查文件扩展名,不如尝试将文件解析为HTML,然后在发生HTML解析异常时向用户显示一个有用的错误。例如,使用BeautifulSoup和HTMLParser:

1
2
3
4
5
6
7
from bs4 import BeautifulSoup
from html.parser import HTMLParseError

try:
    BeautifulSoup(fetched_url_contents)
except HTMLParseError:
    print("Error: you haven't given me html!")