尝试/除了检查字符串

时间:2014-12-18 01:26:59

标签: python

我对如何使用Try/Exceptionif/else感到困惑。如果我想告诉用户提供.html文件

,我该如何编写惯用代码
if url[-4:] ==".html":
        // do your things
else: 
    print('Error! the file is not html file')

我正在检查是否应该在这种情况下使用try/exception或{I} {}}。

4 个答案:

答案 0 :(得分:4)

在Python中,它是Easier to ask for forgiveness than permission。换句话说,Python中的惯用方法就是抛出异常并做出相应的反应,而不是明确地检查条件("在跳跃之前看看",也在链接词汇表中)。所以你的代码应该是这样的:

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

答案 1 :(得分:4)

简而言之:

try:
    a = q.get()

try表示尝试此操作,如果有效,请使用它,否则except如果失败则为其他内容,或者它有效,并且存在ValueError等错误。 / p>

except:
    a = None

更新:

try:
   url[-4:] == ".html"

except: 
    print "Error"

答案 2 :(得分:1)

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

你也可以使用assert,如果你想冒出一个异常来捕获它在上面几个级别的代码:

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

这只是语法糖:

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

当然用这个替换一个简单的if测试是愚蠢的:

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-typing,其中EAFP样式明显偏向于使用hasattr和/或isinstance的LBYL测试。 如果LBYL相对便宜,请不要特别过度使用EAFP - 如果便宜的测试有效,为什么要尝试昂贵的操作呢?

答案 3 :(得分:0)

不是检查文件扩展名,而是尝试将文件解析为HTML,然后在发生HTML解析异常时向用户显示有用的错误。例如,使用BeautifulSoupHTMLParser

from bs4 import BeautifulSoup
from html.parser import HTMLParseError

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