2013-03-24 6 views
12

मेरे पास एक कोशिश खंड में एक कमांड है जो मुझे पता है कि अपवाद फेंकता है। मैं इसे "छोड़कर" खंड में पकड़ने की कोशिश कर रहा हूं, लेकिन छोड़कर खंड अपवाद के अस्तित्व को नहीं पहचानता है। जब मैं एक कोशिश में आदेश डाल/कि सूची में पहले फाइल में निर्माण को छोड़करपायथन अपवाद नहीं पहचाना गया; सिवाय इसके साथ कैसे संभालें?

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 

The,: अपवाद है, जब बिना क्रिया (यानी एक कोशिश खंड में संलग्न नहीं), इस तरह इंटरैक्टिव विंडो में लग रहा है "actions.py", इस तरह:

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

मैं उम्मीद होती है कि इसके बाद के संस्करण खंड "HTTPError: HTTP त्रुटि 500: आंतरिक सर्वर त्रुटि" पकड़ उत्पादन किया जा रहा है जब मैं ncbo_annotate समारोह चलाने के लिए, लेकिन इसके बजाय जब मैं ऊपर चलाएं, मुझे एक त्रुटि मिल रही है कि वैश्विक नाम "HTTPError" परिभाषित नहीं किया गया है:

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 

तो सौदा क्या है? मैंने सोचा कि पायथन अपवाद उठाता है जब तक कि इसे एक कोशिश खंड में एक हैंडलर नहीं मिल जाता है या इसे बिना किसी परेशान कर देता है। मेरे कोड को कोई विचार नहीं है कि HTTPError क्या है, या वैकल्पिक रूप से, मैं इसे कैसे बता सकता हूं कि यह क्या है ताकि यह इसे संभाल सके?

उत्तर

19

आपको शायद इसे उपयोग करने से पहले HTTPError कक्षा आयात करने की आवश्यकता है। अपनी क्रिया.py फ़ाइल के शीर्ष पर डालने का प्रयास करें:

from urllib2 import HTTPError 

और फिर आप अपने कोड का उपयोग करने में सक्षम होना चाहिए।

+2

एक और बात आप कर सकते हैं HTTPError से पहले अपने नाम स्थान डाल दिया जाता है, खंड को छोड़कर इस तरह से लेखन: urllib2.HTTPError को छोड़कर ':' – gerlos

10

आप urllib2.HTTPError के लिए जांच करने की आवश्यकता:

except urllib2.HTTPError: 
1

@ एमिली की समाधान ठीक है, लेकिन वहाँ उस वर्ग आयात किए बिना इस समस्या को हल करने के लिए एक और तरीका है।

तुम बस अपवाद वर्ग का पूरा नाम स्थान देने के लिए की जरूरत है तुम्हें पकड़ करना चाहते हैं:

except urllib2.HTTPError: 

इस तरह आप अपने कोड में कम import खंड की जरूरत है, और यह आसान है आप बाद में जो मॉड्यूल बताने के लिए अपवाद उठाया।

4

अजगर 3 में यह बताया गया है:

from urllib.error import HTTPError 
संबंधित मुद्दे