2013-02-22 42 views
38

मेरे पास एक स्क्रिप्ट है जहां उपयोगकर्ता को फ़ाइल नाम (एक फ़ाइल जो खोला जाना है) टाइप करने के लिए कहा जाता है, और यदि फ़ाइल वर्तमान निर्देशिका में मौजूद नहीं है, तो उपयोगकर्ता को फिर से संकेत दिया जाता है। यहाँ लघु संस्करण है:पायथन की "खुली()" "फ़ाइल नहीं मिली" के लिए अलग-अलग त्रुटियों को फेंकता है - दोनों अपवादों को कैसे संभालें?

file = input("Type filename: ") 

... 
try: 
    fileContent = open(filename, "r") 
    ... 
except FileNotFoundError: 
    ... 

जब मैं अजगर में मेरी MacOS एक्स पर मेरी स्क्रिप्ट का परीक्षण किया 3.3x यह बिल्कुल ठीक है जब मैं उद्देश्य पर गलत फ़ाइल नाम टाइप करें काम किया (यह "उम्मीद" के अंतर्गत सूट कार्यान्वित)।

हालांकि, जब मैं पाइथन 3.2x में एक विंडोज कंप्यूटर पर अपना कोड चलाने के लिए चाहता था, तो मुझे एक त्रुटि मिलती है जो कहती है कि "FileNotFoundError" परिभाषित नहीं है। तो, विंडोज़ पर पायथन 3.2 सोचता है कि "FileNotFoundError" एक चर है और प्रोग्राम एक त्रुटि के साथ छोड़ देता है।

मुझे पता चला कि विंडोज़ पर पाइथन 3.2 "IOError" फेंकता है यदि इनपुट फ़ाइल नाम मान्य नहीं है। मैंने इसे पाइथन 2.7 में अपनी लिनक्स मशीन पर परीक्षण किया, और यह एक आईओईआरर भी है।

मेरे समस्या अब है, उस के साथ कोड

except "FileNotFoundError": 

विंडोज के अजगर 3.2 पर नहीं चलेंगे, लेकिन अगर मैं यह

except "IOError": 

को बदलने के लिए उस पर मेरी मैक काम नहीं करेगा अब और।

मैं इसके आसपास कैसे काम कर सकता हूं? एकमात्र तरीका मैं सोच सकता हूं कि केवल except का उपयोग करना है, जिसे मैं आमतौर पर नहीं चाहता हूं।

+6

यह मैक/विंडोज के कारण नहीं है, यह पायथन के * संस्करण * है। मैं ओएस एक्स पर 3.2/3.3 की जांच भी करूंगा (और विंडोज़ पर 3.3), परिवर्तन लॉग से परामर्श लें, और उसके बाद प्रश्न/शीर्षक को उपयुक्त के रूप में संशोधित करें। –

उत्तर

56

3,3 में, IOError became an alias for OSError में अर्थपूर्ण होता है, और FileNotFoundError का एक उपवर्ग है OSError। तो तुम कोशिश कर सकते हैं

except (OSError, IOError) as e: 
    ... 

यह एक बहुत व्यापक क्षेत्र डाली जाएगा, और आप कल्पना नहीं कर सकते कि अपवाद है e.errno निरीक्षण के बिना "फ़ाइल नहीं मिली", लेकिन यह आपके उपयोग के मामले को कवर कर सकते।

PEP 3151 विस्तार से परिवर्तन के लिए तर्क पर चर्चा करता है।

2

आप एक ही समय

except (FileNotFoundError, IOError):

मुझे नहीं पता था कि है कि तुम क्या पूछ रहे थे पर 2 त्रुटियां पकड़ कर सकते हैं। मुझे आशा है कि वहाँ एक और अधिक सुवक्ता समाधान है तो मैन्युअल रूप से निरीक्षण करने के लिए

try: 
    error_to_catch = FileNotFoundError 
except NameError: 
    error_to_catch = IOError 

except error_to_catch

cwallenpoole इस सशर्त अधिक अपने जवाब (error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError))

+2

यह काम करेगा जहां - * मुझे एक त्रुटि मिलती है जो कहती है कि "FileNotFoundError" परिभाषित नहीं है। तो, विंडोज़ पर पायथन 3.2 सोचता है कि "FileNotFoundError" एक चर है और प्रोग्राम एक त्रुटि * से निकलता है? –

+0

@pst दिलचस्प खेद यह नहीं मानता – dm03514

7

यह मैं एक साधारण except: की तुलना में बेहतर रूप में हमलों, लेकिन मुझे यकीन है कि अगर यह सबसे अच्छा समाधान है नहीं कर रहा हूँ:

error_to_catch = getattr(__builtins__,'FileNotFoundError', IOError) 

try: 
    f = open('.....') 
except error_to_catch: 
    print('!') 
+0

अन्य समाचारों में 'छोड़कर:' एक अल्पविराम के बाद व्याकरणिक रूप से सही है, लेकिन फिर भी बहुत अजीब लगता है। – cwallenpoole

+0

यह भी एक बहुत अच्छा समाधान है। 'को छोड़कर थोड़ा सा लंबा (IOError, OSError): 'लेकिन इसलिए अधिक विशिष्ट –

3

तो बिल्कुल ही पकड़ने के लिए जब एक फ़ाइल नहीं मिला है, मुझे क्या करना:

import errno 
try: 
    open(filename, 'r') 
except (OSError, IOError) as e: # FileNotFoundError does not exist on Python < 3.3 
    if getattr(e, 'errno', 0) == errno.ENOENT: 
     ... # file not found 
    raise