在python中捕获特定的HTTP错误


70

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

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

但是我最终捕获的是任何一种HTTP错误,但是我只想在指定的网页不存在的情况下捕获!可能是HTTP错误404 ..但我不知道如何指定仅捕获错误404并让系统为其他事件运行默认处理程序。


在这篇文章中尝试过食谱吗?stackoverflow.com/questions/1308542/...
约翰·P

Answers:


126

Python 3

from urllib.error import HTTPError

Python 2

from urllib2 import HTTPError

只是捕获HTTPError,处理它,如果不是Error 404,只需使用raise引发该异常即可。

请参阅Python教程

例如Pyhton 2的完整示例

import urllib2
from urllib2 import HTTPError
try:
   urllib2.urlopen("some url")
except HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise

嘿!!这就像魅力!我没想到“提高”把戏!非常感谢你!
阿纳布·森·古普塔

我可以做urllib2.urlopen(“ *”)来处理任何404错误并将其路由到我的404.html页面吗?

1
@TobiasKolb:由于该问题已被标记urllib2(毕竟,它已经存在了9年之久了),并且urllib3它不是标准库的一部分,所以我认为这里不适合。如果还没有重复的内容,也许再问一个新问题?或urllib按照下面Lazik的答案中所述使用。
蒂姆·皮茨克

41

对于Python 3.x

import urllib.request
from urllib.error import HTTPError
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)

使用except urllib.error.HTTPError as err:不使用导入命令的情况将得到catching classes that do not inherit from BaseException is not allowed httperror很好的解决。
Abhijeet

1
@abhjeet通过添加解决了此问题from urllib.error import HTTPError。我编辑了帖子。
felice

3

蒂姆斯的回答对我来说似乎是一种误导。特别是当urllib2不返回预期的代码时。例如,此错误将是致命的(信不信由你-下载URL时并不少见):

AttributeError:“ URLError”对象没有属性“ code”

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

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块是一种好的编程习惯吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.