我对如何使用Try/Exception
和if/else
感到困惑。如果我想告诉用户提供.html
文件
if url[-4:] ==".html":
// do your things
else:
print('Error! the file is not html file')
我正在检查是否应该在这种情况下使用try/exception
或{I} {}}。
答案 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解析异常时向用户显示有用的错误。例如,使用BeautifulSoup和HTMLParser:
from bs4 import BeautifulSoup
from html.parser import HTMLParseError
try:
BeautifulSoup(fetched_url_contents)
except HTMLParseError:
print("Error: you haven't given me html!")