2010-07-29 12 views
8

क्या IOException के कारण प्रोग्रामेटिक रूप से अंतर करने का कोई तरीका है? उदाहरण के लिए जावा लिखने के दौरान त्रुटि होने पर आईओएक्सप्शन फेंक देगा। मैं कैसे कह सकता हूं, अगर इसका उपयोग उल्लंघन उल्लंघन जैसा कुछ है, यदि डिस्क मुक्त स्थान से बाहर है, तो अगर किसी ने नेटवर्क ड्राइव, या अन्य चीजों को डिस्कनेक्ट किया है।प्रोग्रामिंग रूप से IOException के कारण का निर्धारण?

मैं वास्तव में संदेश को पार्स नहीं कर सकता, ऐसा कोई मानकीकृत संदेश प्रारूप प्रतीत नहीं होता है, सूर्य (या अब मुझे लगता है कि ऑरैकल) किसी भी प्रकार का मानकीकृत प्रारूप प्रतीत नहीं होता है।

कोई सुझाव (मैं बहुत जावा, इसकी नहीं मेरे सामान्य भाषा के लिए नया हूँ, लेकिन मैं इसका इस्तेमाल करने के काम पर एक बहुत ही टूटी प्रणाली को ठीक करने की जरूरत है।)

उत्तर

5

दुर्भाग्य से जावा नेट के System.Runtime.InteropServices.Marshal.GetHRForException() का कोई बराबर है। आप बताते हैं कि किस तरह की I/O त्रुटि यह केवल तभी होती है जब अपवाद उप-वर्ग का उदाहरण है, उदा। FileNotFoundException

+0

यह हो सकता है कि मैं क्या सुनना चाहता हूं = (लेकिन आपने मुझे जवाब दिया था। – UberJumper

0

अपवाद की सटीक कक्षा को पकड़ने से आपको IOException के कुछ संभावित उप-वर्गों में से एक मिल जाएगा, और ये काफी मानकीकृत हैं। आप या तो instanceof या (एक क्रूर दृष्टिकोण) के साथ कक्षाओं का परीक्षण कर सकते हैं getClass().getName() से लौटे तारों की तुलना करें।

अन्य सामानों के लिए कुछ कामकाज हैं; आप एक फ़ाइल पर File.canWrite() कर सकते हैं जिसे आप लिखने के लिए खोलने वाले हैं (ठीक है, आपका प्रोग्राम वैसे भी किया जाना चाहिए था, अगर नाम और/या निर्देशिका भिन्न हो सकती है), और यदि कोई मौका है कि आप फ़ाइल स्थान से बाहर हो गए हैं, आप किसी ज्ञात अच्छे स्थान पर एक छोटी फ़ाइल लिखने का प्रयास कर सकते हैं और देख सकते हैं कि क्या यह आपके ऊपर विस्फोट करता है। बहुत सुरुचिपूर्ण नहीं, मुझे पता है: जावा वास्तव में सिस्टम प्रोग्रामिंग भाषा के रूप में नहीं जाना जाता है।

दूसरी ओर, अक्सर अपवाद के लिए एक विस्तृत कारण जानने से बहुत मदद नहीं मिलती है: ज्ञान के साथ या बिना, आपका उपयोगकर्ता प्रोग्राम की आवश्यकता के अनुसार प्रोग्राम प्राप्त करने में सक्षम नहीं हो सकता है।

+3

आपके पहले पैराग्राफ में एक संभावित अनुपूरक - आमतौर पर आप इन अपवादों को पकड़ रहे हैं, इसलिए एक अच्छा विकल्प अलग पकड़ होना है 'FileNotFoundException',' UnknownHostException', आदि के लिए ब्लॉक। यह "स्पष्ट" परीक्षण से बचाता है और आपको शुरुआत से अलग-अलग ब्लॉक में विशेष मामलों को संभालने देता है (अंत में कैच-ऑल 'कैच (IOException e) 'ब्लॉक को छोड़कर) –

+0

@Ahdrzej: आप बहुत सही हैं। मैं बैंड-एड्स फिक्स को पूर्व-मौजूदा कोडिंग के बारे में सोच रहा था और मानता हूं कि uberjumper मौजूदा कैच पदानुक्रमों (जो भी हो सकता है) को फिर से व्यवस्थित नहीं करना चाहता था। लेकिन अगर "कर रहा है यह सही है "एक विकल्प है, तो आपका तरीका यह होगा। –

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