2013-03-24 43 views
12

Tôi có một lệnh trong một điều khoản thử mà tôi biết ném một ngoại lệ. Tôi đang cố gắng nắm bắt nó trong một mệnh đề "ngoại trừ", nhưng điều khoản ngoại trừ dường như không nhận ra sự tồn tại của ngoại lệ. Trường hợp ngoại lệ, khi unhandled (tức là không được bao bọc trong một điều khoản thử), trông như thế này trong cửa sổ tương tác:ngoại lệ python không được nhận dạng; làm thế nào để xử lý với ngoại trừ?

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Users\Andy\software\Turkeys\actions.py", line 234, in annotate 
    annotation=annotator.ncbo_annotate(thing) 
    File "C:\Users\Andy\software\Turkeys\annotator.py", line 49, in ncbo_annotate 
    fh = urllib2.urlopen(submitUrl, postData) 
    File "C:\32Python27\lib\urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\32Python27\lib\urllib2.py", line 406, in open 
    response = meth(req, response) 
    File "C:\32Python27\lib\urllib2.py", line 519, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\32Python27\lib\urllib2.py", line 444, in error 
    return self._call_chain(*args) 
    File "C:\32Python27\lib\urllib2.py", line 378, in _call_chain 
    result = func(*args) 
    File "C:\32Python27\lib\urllib2.py", line 527, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
HTTPError: HTTP Error 500: Internal Server Error 

những khi tôi đặt các lệnh trong một thử/trừ xây dựng trong file đầu tiên trong danh sách đó, "actions.py", như thế này:

try: 
    annotation=annotator.ncbo_annotate(thing) 
except HTTPError: 
    ...do some things with this 

tôi mong rằng mệnh đề trên sẽ bắt "HTTPError: Lỗi HTTP 500: Lỗi máy chủ nội bộ" được tạo ra khi tôi chạy chức năng ncbo_annotate, nhưng thay vào đó khi tôi chạy ở trên, tôi gặp lỗi khi nói rằng tên toàn cục "HTTPError" không được xác định:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Users\Andy\software\Turkeys\actions.py", line 235, in annotate 
    except HTTPError: 
NameError: global name 'HTTPError' is not defined 

Vậy thỏa thuận là gì? Tôi nghĩ rằng python tăng ngoại lệ cho đến khi nó tìm thấy một handler trong một điều khoản try hoặc spits nó ra unhandled. Tại sao mã của tôi không có ý tưởng gì về HTTPError, hay cách khác, làm thế nào để tôi biết nó là gì để nó có thể xử lý nó?

Trả lời

19

Có thể bạn chỉ cần nhập lớp HTTPError trước khi sử dụng. Hãy thử chèn ở đầu tệp actions.py của bạn:

from urllib2 import HTTPError 

và sau đó bạn sẽ có thể sử dụng mã của mình.

+2

Một điều bạn có thể làm là đặt trước HTTPError gian tên của nó, bằng văn bản cho except theo cách này: 'trừ urllib2.HTTPError:' – gerlos

10

Bạn cần phải kiểm tra cho urllib2.HTTPError:

except urllib2.HTTPError: 
1

@ giải pháp của Emily là tốt, nhưng có một cách khác để giải quyết vấn đề này mà không cần nhập khẩu lớp đó.

Bạn chỉ cần cung cấp cho các không gian tên đầy đủ của lớp ngoại lệ bạn muốn bắt:

except urllib2.HTTPError: 

Bằng cách này bạn cần ít import khoản trong mã của bạn, và nó dễ dàng hơn để bạn có thể nói sau đó mô-đun nêu ra ngoại lệ.

4

Trong Python 3 đó là:

from urllib.error import HTTPError