2010-07-15 41 views
10

làm cách nào để tôi có thể bắt lỗi 404 và 403 cho các trang trong python và urllib (2) chẳng hạn?Bắt lỗi http

Có cách nào nhanh chóng không có trình bao bọc lớp lớn không?

thông tin gia tăng (stack trace):

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    page = urllib2.urlopen("http://localhost:4444") 
    File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 

Trả lời

20
import urllib2 
try: 
    page = urllib2.urlopen("some url") 
except urllib2.HTTPError, err: 
    if err.code == 404: 
     print "Page not found!" 
    elif err.code == 403: 
     print "Access denied!" 
    else: 
     print "Something happened! Error code", err.code 
except urllib2.URLError, err: 
    print "Some other error happened:", err.reason 

Trong trường hợp của bạn, lỗi xảy ra đã trước khi kết nối HTTP có thể được xây dựng - do đó bạn cần phải thêm một xử lý lỗi mà bắt URLError. Nhưng điều này không liên quan gì đến lỗi 404 hoặc 403.

+0

này làm việc cho 403, nhưng không 404. 'urllib2.URLError: ' – Ockonal

+0

Đó là bởi vì nó không phải là một lỗi 404 bạn đang nhìn thấy. Thông báo lỗi cho biết "Kết nối bị từ chối" - không phải "Không tìm thấy trang". –

+0

Vâng, bạn nói đúng. Nhưng cũng có dấu vết ngoại lệ dài trước nó. Vì vậy, đó là ngoại lệ uncatched, phải không? Vấn đề chính là bắt lỗi chính xác. Bạn có thể giúp với điều này không? – Ockonal

5
req = urllib2.Request('url') 
>>> try: 
>>>  urllib2.urlopen(req) 
>>> except urllib2.URLError, e: 
>>>  print e.code 
>>>  print e.read()