捕获python中的特定HTTP错误

catch specific HTTP error in python

我想捕获一个特定的http错误,而不是整个家庭中的任何一个..
我想要做的是 -

1
2
3
4
5
import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

但我最终得到的是捕获任何类型的http错误,但我只想抓住指定的网页不存在!! 可能那是HTTP错误404 ..但我不知道如何指定只捕获错误404并让系统运行其他事件的默认处理程序..建议?


只需捕获urllib2.HTTPError,处理它,如果它不是错误404,只需使用raise重新引发异常。

请参阅Python教程。

所以你可以这样做:

1
2
3
4
5
6
7
8
import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise


对于Python 3.x

1
2
3
4
5
import urllib.request
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)


蒂姆的回答在我看来是误导性的。 特别是当urllib2没有返回预期的代码时。 例如,此错误将是致命的(相信与否 - 下载网址时并不罕见):

AttributeError: 'URLError' object has no attribute 'code'

快速,但也许不是最好的解决方案是使用嵌套try / except块的代码:

1
2
3
4
5
6
7
8
9
10
11
import urllib2
try:
    urllib2.urlopen("some url")
except urllib2.HTTPError, err:
    try:
        if err.code == 404:
            # Handle the error
        else:
            raise
    except:
        ...

有关嵌套try / except块主题的更多信息在python中嵌套try / except块是一个很好的编程习惯吗?