2015-08-01 8 views
6

में एक कथन के अंदर अपवाद हैंडलिंग मुझे पता है कि पायथन में file.close() विधि में कोई वापसी मूल्य नहीं है, लेकिन मुझे कोई जानकारी नहीं मिल रही है कि कुछ मामलों में यह अपवाद फेंकता है या नहीं। यदि यह ऐसा नहीं करता है, तो मुझे लगता है कि इस प्रश्न का दूसरा भाग अनिवार्य है।file.close() पायथन

यदि ऐसा होता है, तो file.close() फ़ाइल को खोलने के लिए उपयोग किए गए "साथ" कथन के अंदर अपवाद फेंकने के लिए "सही" तरीका क्या होगा?

क्या ऐसी स्थिति है जहां file.close() फ़ाइल खोलने और सफलतापूर्वक पढ़ने के तुरंत बाद विफल हो सकती है?

+0

यदि आप पाइथन 2.5 या उच्चतर का उपयोग कर रहे हैं, तो 'साथ' ब्लॉक स्वचालित रूप से आपके लिए फ़ाइल बंद कर देगा। उस मामले में स्पष्ट रूप से 'बंद() 'को स्पष्ट करने की आवश्यकता नहीं है। – Daniel

+1

@ डैनियल, ओपी पायथन 3.x टैग का उपयोग करता है। @ बिट्रैक्स आप त्रुटि को प्रिंट कर सकते हैं यदि यह ''प्रयास' के साथ अपना 'कथन' लपेटकर होता है: अपवाद को छोड़कर, ई: प्रिंट (ई)' – awbemauler

+2

कथन के साथ अपवादों को फेंकने के अलावा उन्हें संभालने के लिए कोई रास्ता नहीं है /के सिवाय।के साथ/छोड़कर प्रस्तावित किया गया था लेकिन गोली मार दी गई। बयान के साथ सरल उपयोग मामलों के लिए वाक्य रचनात्मक चीनी होती है जहां कोई अपवाद अपेक्षित नहीं होता है। विस्तारित चर्चा के लिए http://stackoverflow.com/questions/8774830/how-with-is-better-than-try-catch-to-open-a-file-in-python देखें। –

उत्तर

4

हां, file.close()IOError अपवाद फेंक सकता है। यह तब हो सकता है जब फ़ाइल सिस्टम कोटा का उपयोग करता है, उदाहरण के लिए। C close() function man page देखें:

close() की वापसी मान की जाँच नहीं एक आम लेकिन फिर भी गंभीर प्रोग्रामिंग त्रुटि है। यह काफी संभव है कि पिछले write(2) ऑपरेशन पर त्रुटियों की पहली बार अंतिम close() पर रिपोर्ट की गई है। फ़ाइल बंद करते समय रिटर्न वैल्यू की जांच नहीं कर सकती है जिससे डेटा की चुप हानि हो सकती है। यह विशेष रूप से एनएफएस और डिस्क कोटा के साथ मनाया जा सकता है।

सी close() समारोह के एक गैर शून्य वापसी मान एक IOError अपवाद को ऊपर उठाने के अजगर की ओर जाता है।

try: 
    with open(filename, mode) as fileobj: 
     # do something with the open file object 
except IOError as exc: 
    # handle the exception 
बेशक

, IOError भी उद्घाटन दौरान फेंक दिया जा सकता था:

आप इस अपवाद को संभालने के लिए चाहते हैं, तो एक try...except ब्लॉक आसपासwith बयान डाल दिया।

+0

'बेशक, IOError को खोलने के दौरान भी फेंक दिया जा सकता था।' इस मामले में आप एक ['ExitStack'] (https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack) का उपयोग करते हैं। यह सुनिश्चित करने के लिए कि [बाहर निकलने पर उठाया गया] [https://docs.python.org/3/library/contextlib.html#catching-exceptions-from-enter-methods)। – Navith

+1

@Navith या पहले फ़ाइल ऑब्जेक्ट खोलें और * फिर * इसे संदर्भ प्रबंधक के रूप में उपयोग करें। –

-1

आप

file object = open(file_name [, access_mode][, buffering]) 

तो फिर तुम जाँच

file.closed 

यह सच वापसी अगर फाइल बंद कर दी और झूठे है अन्यथा उपयोग कर सकते हैं।

+0

यह प्रश्न का उत्तर देना भी शुरू नहीं करता है * file.close() 'कोई अपवाद फेंकता है? * ओपी ** ** नहीं है ** यह पूछने के लिए कि फाइल ऑब्जेक्ट खुला है या बंद है या नहीं। –

+0

ओह, क्षमा करें - मैंने क्यू अच्छी तरह से नहीं पढ़ा। –

+0

यह सब अच्छा है; एसओ में आपका स्वागत है जैसे ही आप साइट पर प्रश्नों का उत्तर देते हैं, बस उत्तर सबमिट करने से पहले उन्हें सावधानी से पढ़ना याद रखें। वैकल्पिक रूप से, जब आप पर्याप्त प्रतिष्ठा कमाते हैं, तो आप सवाल पर एक टिप्पणी छोड़ सकते हैं। – Daniel

1

close अपवाद फेंक सकता है, उदाहरण के लिए, यदि आप डिस्क स्पेस से बाहर निकलते हैं, तो यह आपके पिछले लिखने को फ़्लैश करने का प्रयास कर रहा है, या यदि आपने यूएसबी स्टिक को खींच लिया है तो फ़ाइल चालू थी।

इससे निपटने के सही तरीके के लिए, यह आपके आवेदन के विवरण पर निर्भर करता है। शायद आप उपयोगकर्ता को एक त्रुटि संदेश दिखाना चाहते हैं। शायद आप अपना प्रोग्राम बंद करना चाहते हैं। हो सकता है कि आप जो भी कर रहे थे, पुनः प्रयास करना चाहते हैं, लेकिन एक अलग फ़ाइल के साथ। जो भी प्रतिक्रिया आप चुनते हैं, उसे शायद try - except ब्लॉक के साथ लागू किया जाएगा, जो आपके प्रोग्राम की जो भी परत है, उससे निपटने के लिए सबसे अच्छी तरह सुसज्जित है।

संबंधित मुद्दे