क्या मेरे async टास्क लाइब्रेरी को अपवादों को चुपचाप निगल जाना चाहिए?


10

मैंने अभी सीखा है कि .NET 4.5 ने एक बदलाव पेश किया कि कैसे एक अपवाद के अंदर अपवाद Taskहैं। अर्थात्, वे चुपचाप दबा रहे हैं।

ऐसा क्यों किया गया, इसके लिए आधिकारिक तर्क "हम अनुभवहीन डेवलपर्स के लिए अधिक अनुकूल होना चाहते थे" प्रतीत होता है।

.NET 4.5 में, टास्क में .NET 4 की तुलना में काफी अधिक प्रमुखता है, क्योंकि वे C # और विजुअल बेसिक भाषाओं के लिए बेक किए गए हैं, जो भाषाओं द्वारा समर्थित नई async सुविधाओं के भाग के रूप में हैं। यह प्रभावी रूप से टास्क को अनुभवी डेवलपर्स के डोमेन से हटाकर सभी के दायरे में ले जाता है। नतीजतन, यह अपवादों से निपटने के लिए कितना सख्त हो सकता है, इसके बारे में ट्रेडऑफ़ का एक नया सेट भी होता है।

( स्रोत )

मैंने विश्वास करना सीखा है कि .NET में बहुत से निर्णय ऐसे लोगों द्वारा किए गए थे जो वास्तव में जानते हैं कि वे क्या कर रहे हैं, और आमतौर पर वे तय करने के पीछे एक बहुत अच्छा कारण है। लेकिन यह मुझे बचता है।

अगर मैं अपनी खुद की एसिक्स टास्क लाइब्रेरी डिज़ाइन कर रहा था, तो अपवादों को निगलने का क्या फायदा जो फ्रेमवर्क के डेवलपर्स ने देखा कि मैं नहीं देख रहा हूँ?


4
+1। अच्छा सवाल है, इस तथ्य को देखते हुए कि आप जिन अपवादों को नहीं संभाल सकते हैं, उनका प्रचार नहीं करना अतुल्यकालिक संदर्भ के अलावा भी एक बुरा अभ्यास है। इसके अलावा, अनुभवहीन डेवलपर्स के बारे में तर्क बहुत ही कम है, IMHO। कोड के एक टुकड़े की तुलना में शुरुआती के लिए और अधिक अजीब क्या होगा जो न केवल काम करता है, बल्कि जो भी हो, कोई अपवाद नहीं फेंकता है?
आर्सेनी मूरज़ेंको

@ मेनमा बिल्कुल मेरे विचार, लेकिन मैं पहले गलत हो चुका हूं (जब यह पता चला कि उन्होंने किया था, वास्तव में, एक बहुत अच्छा, लेकिन स्पष्ट कारण है), तो मैंने सोचा कि मैं पूछूंगा।
रोमन स्टार्कोव

2
वाह, मुझे खुशी है कि आपने इसे पोस्ट किया क्योंकि यह पहली बार है जब मैंने इसके बारे में सुना है; और यह निश्चित रूप से POLA का उल्लंघन करता है । आप सही हैं कि उन लोगों को वास्तव में पता है कि वे क्या कर रहे हैं, इसलिए, मैं ईमानदारी से उत्सुक हूं कि इसके पीछे क्या तर्क हो सकता है ... आश्चर्य है कि अगर यह एक अधिक तकनीकी कारण है जो कि Async के कार्यान्वयन के आधार पर मिला है और कैसे अपवाद प्रचारित करेंगे नीचे के रूप में एक coroutine को पारित किया जा रहा है ..
जिमी Hoffa

जवाबों:


2

इसके लायक क्या है, जिस दस्तावेज से आप जुड़े हैं , वह औचित्य के रूप में एक उदाहरण का मामला देता है:

Task op1 = FooAsync(); 
Task op2 = BarAsync(); 
await op1; 
await op2;

इस कोड में, डेवलपर समानांतर में चलने के लिए दो अतुल्यकालिक संचालन शुरू कर रहा है, और फिर नई प्रतीक्षा भाषा सुविधा का उपयोग करते हुए प्रत्येक के लिए अतुल्यकालिक रूप से प्रतीक्षा कर रहा है ... [C] ऑनरसाइडर अगर op1 और op2 दोनों गलती से क्या होगा। Op1 का इंतजार करना op1 के अपवाद का प्रचार करेगा, और इसलिए op2 का कभी इंतजार नहीं किया जाएगा। नतीजतन, op2 का अपवाद नहीं देखा जाएगा, और प्रक्रिया अंततः दुर्घटनाग्रस्त हो जाएगी।

डेवलपर्स के लिए कार्य के आधार पर अतुल्यकालिक कोड लिखना आसान बनाने के लिए, .NET 4.5 बिना अपवाद वाले अपवादों के लिए डिफ़ॉल्ट अपवाद व्यवहार को बदलता है। हालांकि बिना अपवाद वाले अपवाद अभी भी बिना बताए किए गए अपवाद स्थिति को उठाएंगे (ऐसा नहीं करना एक ब्रेकिंग परिवर्तन होगा), प्रक्रिया डिफ़ॉल्ट रूप से क्रैश नहीं होगी। बल्कि, इस घटना के उठाए जाने के बाद अपवाद समाप्त हो जाएगा, भले ही कोई ईवेंट हैंडलर अपवाद देखे।

मैं इससे आश्वस्त नहीं हूं। यह एक असंदिग्ध की संभावना को हटा देता है, लेकिन त्रुटि का पता लगाने के लिए कठिन है (रहस्यमय कार्यक्रम दुर्घटना जो वास्तविक त्रुटि के बाद लंबे समय तक हो सकती है), लेकिन इसे पूरी तरह से मौन त्रुटि की संभावना के साथ बदल देती है - जो बाद में समस्या का पता लगाने में समान रूप से कठिन हो सकती है। अपने कार्यक्रम में यह मेरे लिए एक संदिग्ध पसंद की तरह लगता है।

व्यवहार कॉन्फ़िगर करने योग्य है - लेकिन निश्चित रूप से, 99% डेवलपर्स केवल डिफ़ॉल्ट व्यवहार का उपयोग करने जा रहे हैं, इस मुद्दे के बारे में कभी नहीं सोचते हैं। इसलिए उन्होंने डिफ़ॉल्ट के रूप में जो चुना वह एक बड़ी बात है।


लेकिन आप ऐसा करने के लिए एक सामान्य अपवाद op1, है ना? तो यह है कि एक अवशेष बिना क्रिया है, यह होगा सही प्रक्रिया को नीचे लाने?
टिमवी

1
@ टिमवी, जैसा कि मैं इसे समझता हूं, न तो op1अपवाद और न ही op2अपवाद कार्यक्रम को नीचे लाएगा। लाभ यह है कि आपके पास दोनों का निरीक्षण करने का अवसर है। लेकिन अगर तुम नहीं, वे दोनों निगल लिया जाएगा। मुझसे गलती भी हो सकती है।

मैं वास्तव में आश्चर्यचकित हूं कि वे आपको दोनों का "अवलोकन" करने के लिए इतना महत्वपूर्ण मानते हैं। यदि आप उन्हें "अवलोकन" करना चाहते हैं, तो आप उन्हें पकड़ते हैं और कार्य परिणाम के माध्यम से उनकी घटना की रिपोर्ट करते हैं! ... आपके तर्क से सहमत, +1
रोमन स्टार्कोव

2

टीएल; डीआर - नहीं , आपको चुपचाप अपवादों को नजरअंदाज नहीं करना चाहिए।


आइए धारणाओं को देखें।

  • आपका अंध विश्वास

मैंने विश्वास करना सीखा है कि .NET में बहुत से निर्णय ऐसे लोगों द्वारा किए गए थे जो वास्तव में जानते हैं कि वे क्या कर रहे हैं, और आमतौर पर वे तय करने के पीछे एक बहुत अच्छा कारण है। लेकिन यह मुझे बचता है।

MS के पास वास्तव में कर्मचारियों पर कुछ शानदार लोग हैं, इसमें कोई संदेह नहीं है। उनके पास कई प्रबंधक और अधिकारी भी हैं जो हैं ... क्लूलेस, और जो लगातार खराब निर्णय लेते हैं। उत्पाद विकास की तकनीकी रूप से जानकार वैज्ञानिक की परियों की कहानी पर हम जितना विश्वास करना चाहते हैं, वास्तविकता उससे कहीं अधिक गंभीर है।

मेरा कहना है, अगर आपकी वृत्ति आपको बताती है कि कुछ गलत हो सकता है तो एक अच्छा मौका है (और पिछले मिसाल) कि यह गलत है।

  • यह एक तकनीकी मुद्दा है

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

उपयोगकर्ता और अंतिम उपयोगकर्ता और डेवलपर के बीच की इस काल्पनिक बातचीत पर विचार करें।

उपयोगकर्ता: एप्लिकेशन टूट गया है।
देव: क्या टूटा है?
उपयोगकर्ता: मुझे पता नहीं है, मैं बटन पर क्लिक करता हूं और कुछ भी नहीं होता है।
देव: क्या मतलब है तुम्हारा कुछ नहीं होता?
उपयोगकर्ता: देखो, मैं क्लिक करता हूं, मैं प्रतीक्षा करता हूं, और मैं प्रतीक्षा करता हूं, और मैं प्रतीक्षा करता हूं, और कुछ भी नहीं ... यह स्पष्ट रूप से टूट गया है।

हमारे गरीब, सौभाग्य से काल्पनिक डेवलपर को अब यह पता लगाना है कि घटनाओं की श्रृंखला में क्या गलत हुआ। यह कहां था?
इवेंट हैंडलर नोटिफिकेशन -> रूटीन को ईवेंट को हैंडल करने के लिए -> हैंडलर द्वारा ट्रिगर की गई विधि -> एसिंक्रोनस कॉल की शुरुआत -> OSI नेटवर्किंग की 7 लेयर्स -> फिजिकल ट्रांसमिशन -> OSI नेटवर्किंग की 7 लेयर्स का बैकअप लें -> सर्विस -> सेवा द्वारा बुलाया विधि -> ... -> सेवा द्वारा भेजा गया वापसी उत्तर -> .... -> asynch रसीद -> asynch उत्तर का प्रसंस्करण>> ...

और कृपया ध्यान दें कि मैंने वहाँ कई संभावित त्रुटि पथों पर काम किया है।


कुछ अंतर्निहित धारणाओं को संबोधित करने के बाद, मुझे लगता है कि यह अधिक स्पष्ट हो जाता है कि चुपचाप अपवादों को क्यों दबा देना एक बुरा विचार है। एक अपवाद और संबंधित त्रुटि संदेश उपयोगकर्ताओं के लिए एक महत्वपूर्ण संकेतक है कि कुछ गलत हो गया है। भले ही संदेश अंत उपयोगकर्ता के लिए अर्थहीन हो, एम्बेडेड जानकारी डेवलपर के लिए उपयोगी हो सकती है यह समझने में कि क्या गलत हुआ। यदि वे भाग्यशाली हैं, तो संदेश भी समाधान की ओर ले जाएगा।

मुझे लगता है कि इस समस्या का एक हिस्सा यह है कि एक गलत तरीके से संभाला गया अपवाद आपके एप्लिकेशन को क्रैश कर देगा। अपवादों को दबाने से, एप्लिकेशन क्रैश नहीं होगा। इसके लिए कुछ वैधता है, हालांकि चूंकि एसिंक्स का बिंदु एप्लिकेशन को काम करते रहने की अनुमति देना है, जबकि डेटा पुनर्प्राप्त किया जा रहा है। यह कहना ज्यादा तर्कसंगत नहीं है कि अगर आप नतीजों का इंतजार करते हुए काम कर सकते हैं, तो रिट्रीवल में असफलता या तो एप्लिकेशन को क्रैश नहीं कर सकती है - इस async कॉल को स्पष्ट रूप से घोषित किया जाता है, ताकि आवेदन समाप्त करने के लिए पर्याप्त महत्वपूर्ण न हो।

तो यह एक समाधान है, लेकिन यह गलत समस्या को हल कर रहा है। यह अपवाद को संभालने के लिए एक आवरण प्रदान करने के लिए इतना प्रयास नहीं करता है ताकि आवेदन चालू रह सके। अपवाद पकड़ा गया है, त्रुटि संदेश स्क्रीन या फेंक दिया गया है, और एप्लिकेशन को चालू रखने की अनुमति है। अपवाद को दबाने से तात्पर्य यह है कि त्रुटियों को अनदेखा करने से ए-ओके होने वाला है और आपके परीक्षण से यह सुनिश्चित हो जाएगा कि अपवाद कभी भी क्षेत्र में नहीं बचेंगे।

इसलिए मेरा अंत मूल्यांकन यह है कि लोगों को एक अतुल्यकालिक मॉडल में धकेल कर बनाई गई समस्या को हल करने का यह एक अर्ध-बेक्ड प्रयास है जब वे अपनी सोच को उस दृष्टिकोण में स्थानांतरित करने के लिए तैयार नहीं थे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.