2012-01-23 6 views
17

में डिफ़ॉल्ट संदेश के साथ अंतर्निहित अपवाद बढ़ाना मैं एक ऐसी विधि को लागू करने की कोशिश कर रहा हूं जो किसी निश्चित निर्देशिका में मौजूद होने पर त्रुटि लौटाता हो।पायथन

raise OSError("Directory does not exist.") करने के बजाय, हालांकि, मैं ओएसईआरआरआर: OSError: [Errno 2] No such file or directory: से बिल्टिंट त्रुटि संदेश का उपयोग करना चाहता हूं। ऐसा इसलिए है क्योंकि मैं बाद में विधि कॉल की शुरुआत में अपवाद उठा रहा हूं (जो कि बिना किसी आवश्यक raise के बिना पाइथन से एक ही संदेश का आह्वान करेगा)।

कोई बात नहीं? (अन्य मैन्युअल OSError("[Errno 2] No such file or directory: ") कर की तुलना में)

+2

उत्प्रेरक और यह जाने प्रचार? – delnan

+0

आप अपनी विधि कॉल की शुरुआत में अपवाद क्यों नहीं उठा सकते हैं, उदा। 'ओएसईआरर (...)' बढ़ाओ के साथ? यह आपके कॉलर को बताने का एक बिल्कुल वैध तरीका है कि एक समस्या है। –

+0

बिल्कुल जो मैं करने की कोशिश कर रहा था ~ मैं बस अंतर्निहित त्रुटि संदेशों तक पहुंचने का एक तरीका ढूंढ रहा था। – bow

उत्तर

22
import os 

try: 
    open('foo') 
except IOError as err: 
    print(err) 
    print(err.args) 
    print(err.filename)  

[Errno 2] No such file or directory: 'foo' 
(2, 'No such file or directory') 
foo 

पैदा करता है तो, इस प्रकार के संदेश उपयोग

raise OSError(2, 'No such file or directory', 'foo') 
+2

+1 उसे नहीं पता था! – juliomalegria

+3

'errno' मॉड्यूल और' os.strerror' से त्रुटि नामों का उपयोग करके उन्हें स्थानीयकृत संदेश स्ट्रिंग में अनुवाद करने के लिए हार्ड-कोड किए गए मानों के लिए बेहतर है: 'OSError (errno.ENOENT, os.strerror (errno.ENOENT), फ़ाइल नाम) ' – user3426575

+0

अपवाद के बारे में जानकारी प्राप्त करने के लिए ** e.errno, e.filename, और e.strerror ** का उपयोग करें। ध्यान दें ऐसा लगता है कि ये सभी कोई नहीं हैं (errno सहित) जब तक कि अपवाद में कम से कम दो तर्क निर्दिष्ट नहीं होते हैं, फ़ाइल नाम तीसरे तर्क के साथ होता है। –

-1
try: 
    # ... 
except OSError: 
    raise OSError("your answer") 
+0

इस तरह के विचार के लिए खेद है, मैं एंड्रॉइड से उत्तर पोस्ट करता हूं और इसमें कोई सामान्य कोड संपादित नहीं होता है – pod2metra

9

के साथ एक OSError उत्पन्न करने के लिए एक के लिए त्रुटि संदेश प्राप्त करने के लिए दिया गया त्रुटि कोड, आप os.strerror का उपयोग करना चाहेंगे:

>>> os.strerror(2) 
'No such file or directory' 

इसके अलावा, आप उन त्रुटियों के लिए मानक संक्षिप्त उपयोग करने के लिए errno मॉड्यूल का उपयोग करना चाह सकते हैं:

>>> errno.ENOENT 
2 
>>> os.strerror(errno.ENOENT) 
'No such file or directory' 
+0

वाह, मुझे यह नहीं पता था। यह उपयोगी होगा :)। धन्यवाद! – bow

1

मुझे लगता है कि वास्तविक समस्या यहाँ है कि आप शायद पहले से बजाय चेक की एक गुच्छा कर रहे हैं सिर्फ कोशिश कर रहा हूं।

if [SPECIAL CASE]: 
    [HANDLING CODE] 
elif [special case]: 
    [SPECIAL CASE] 
[CODE] 
2

मुझे लगता है कि "अपवाद" क्या आप "त्रुटि" बुला रहे हैं के लिए अजगर भाषा का शब्द है:

try: 
    [CODE] 
except Exception: 
    [HANDLING CODE] 

तुलना में काफी बेहतर है। इसलिए जब आप अधिक जानकारी के लिए खोज करते हैं तो इस शब्द का उपयोग करें।

आपको Python Standard Library documentation, "6. Built-in Exceptions" पढ़ने के लिए उपयोगी लगता है।

OSError अंतर्निहित अपवादों में से एक है। इसे "बिल्ट-इन अपवाद" खंड में परिभाषित किया गया है, जो कहते हैं, "errno विशेषता इरनो से एक संख्यात्मक त्रुटि कोड है, और strerror विशेषता संबंधित स्ट्रिंग है, जैसा कि सी फ़ंक्शन perror() द्वारा मुद्रित किया जाएगा। मॉड्यूल errno देखें , जिसमें अंतर्निहित ऑपरेटिंग सिस्टम द्वारा परिभाषित त्रुटि कोड के नाम शामिल हैं। "

इस कोड चल रहा है:

raise OSError(42, "my exception string", "no_such_file.dat") 

मुझे इस परिणाम देता है:

Traceback (most recent call last): 
    Line 1, in <module> 
    raise OSError(42, "my exception string", "no_such_file.dat") 
OSError: [Errno 42] my exception string: 'no_such_file.dat' 

तो, मुझे लगता है कि अपने कोड की तरह कुछ कर सकता है: अपवाद

raise OSError(2, "No such file or directory", filename)