बिना किसी अपवाद के इलाज कैसे करें? (आवेदन को समाप्त करें। इसे जीवित रखें)


30

जब एक डेस्कटॉप अनुप्रयोग में एक अपवाद नहीं होता है तो सबसे अच्छा अभ्यास क्या है?

मैं उपयोगकर्ता को एक संदेश दिखाने के बारे में सोच रहा था, ताकि वह समर्थन से संपर्क कर सके। मैं उपयोगकर्ता को एप्लिकेशन को पुनः आरंभ करने की सलाह दूंगा, लेकिन इसे बलपूर्वक नहीं। यहां जो चर्चा की गई है, उसके समान है: ux.stackexchange.com - अप्रत्याशित एप्लिकेशन त्रुटियों को संभालने का सबसे अच्छा तरीका क्या है?

परियोजना एक .NET WPF अनुप्रयोग है, इसलिए वर्णित प्रस्ताव इस तरह दिख सकता है (ध्यान दें कि यह एक सरलीकृत उदाहरण है। संभवतः अपवाद विवरण को छिपाने के लिए जब तक कि उपयोगकर्ता "विवरण दिखाएँ" पर क्लिक न करें और कुछ कार्यक्षमता प्रदान करें। आसानी से त्रुटि रिपोर्ट):

public partial class App : Application
{
    public App()
    {
        DispatcherUnhandledException += OnDispatcherUnhandledException;
    }

    private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        LogError(e.Exception);
        MessageBoxResult result = MessageBox.Show(
             $"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" +
                        "We recommend to restart the application. " +
                        "Do you want to stop the application now? (Warning: Unsaved data gets lost).", 
            "Unexpected error occured.", MessageBoxButton.YesNo);

        // Setting 'Handled' to 'true' will prevent the application from terminating.
        e.Handled = result == MessageBoxResult.No;
    }

    private void LogError(Exception ex)
    {
        // Log to a log file...
    }
}

कार्यान्वयन (ViewModels के कमांडर या बाहरी घटनाओं के इवेंट हैंडलर) में, तब मैं केवल विशिष्ट बहिर्जात अपवाद को पकड़ लूंगा और अन्य सभी अपवादों (हड्डी और अज्ञात अपवादों) को ऊपर वर्णित "अंतिम उपाय हैंडलर" तक बबल कर दूंगा। हड्डीविहीन और बहिर्जात अपवादों की परिभाषा पर एक नज़र है: एरिक लिपर्ट - वेक्सिंग अपवाद

क्या यह समझ में आता है कि उपयोगकर्ता को यह तय करने देना चाहिए कि क्या आवेदन को समाप्त कर दिया जाना चाहिए? जब एप्लिकेशन को समाप्त कर दिया जाता है, तो आपके पास सुनिश्चित करने के लिए कोई असंगत स्थिति नहीं होती है ... दूसरी तरफ उपयोगकर्ता बिना सहेजे गए डेटा को ढीला कर सकता है या किसी भी शुरू की गई बाहरी प्रक्रिया को तब तक रोक नहीं सकता है जब तक कि आवेदन पुनः आरंभ नहीं हो जाता है।

या क्या निर्णय है कि यदि आप आवेदन कर रहे हैं, तो आप किस प्रकार के आवेदन के आधार पर बिना किसी अपवाद के आवेदन समाप्त कर सकते हैं? क्या यह कोड " कम्प्लीट, सेकंड एडिशन " में वर्णित "मजबूती" बनाम "शुद्धता" के बीच का व्यापार है

आपको कुछ संदर्भ देने के लिए हम किस प्रकार के आवेदन के बारे में बात कर रहे हैं: आवेदन का उपयोग मुख्य रूप से रासायनिक प्रयोगशाला उपकरणों को नियंत्रित करने और उपयोगकर्ता को मापा परिणाम दिखाने के लिए किया जाता है। ऐसा करने के लिए WPF एप्लिकेशन कुछ सेवाओं (स्थानीय और दूरस्थ सेवाओं) के साथ संचार करता है। WPF एप्लिकेशन उपकरणों के साथ सीधे संवाद नहीं करता है।


27
यदि आप एक अपवाद की उम्मीद नहीं करते हैं, तो आप कैसे सुनिश्चित कर सकते हैं कि आवेदन सुरक्षित रूप से चालू रह सकता है?
डिडुप्लिकेटर

2
@ डेडप्लिकेटर: बेशक, आप निश्चित नहीं हो सकते। जैसा कि पहले से ही मैथ्यू के जवाब के लिए टिप्पणी के रूप में लिखा गया है : "हां, बेशक आवेदन एक अमान्य स्थिति में हो सकता है। हो सकता है कि कुछ ViewModel केवल आंशिक रूप से अपडेट हो गया है। लेकिन क्या यह कोई नुकसान पहुंचा सकता है? उपयोगकर्ता डेटा को फिर से लोड कर सकता है और यदि कुछ अमान्य हो जाएगा? सेवा को भेजें, फिर सेवा इसे वैसे भी स्वीकार नहीं करेगी। क्या यह उपयोगकर्ता के लिए बेहतर नहीं है यदि वह एप्लिकेशन को पुनरारंभ करने से पहले सहेजने में सक्षम है? "
जोनास बेंज

2
@ तो, आप सुनिश्चित करें कि आवेदन हमेशा एक अपवाद की उम्मीद करके सुरक्षित रूप से जा सकता है? लगता है कि आप एक अप्रत्याशित अपवाद प्राप्त करने के आधार से इनकार कर रहे हैं।
डेडुप्लिकेटर

2
किसी भी स्थिति में, कृपया त्रुटि संदेश को प्रतिलिपि योग्य बनाएं। वैकल्पिक रूप से, कहें कि यह किस लॉग फ़ाइल में लिखा गया है।
ComFreek

2
जरूरी नहीं कि हैंडलिंग स्पष्ट रूप से स्पष्ट हो। यदि आप सुनिश्चित कर सकते हैं कि आवेदन सुरक्षित रूप से जारी रह सकता है, तो आपने अपवाद को संभाल लिया है।
chepner

जवाबों:


47

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

निम्नलिखित बिंदुओं के विश्लेषण से शुरू करें:

  • एक कार्यक्रम समाप्ति के मामले में वास्तव में कितना डेटा खो सकता है?

  • उपयोगकर्ता के लिए ऐसा नुकसान वास्तव में कितना गंभीर है? क्या खोए हुए डेटा को 5 मिनट से कम में समेटा जा सकता है, या हम एक दिन काम करने की बात कर रहे हैं?

  • कुछ "मध्यवर्ती बैकअप" रणनीति को लागू करने के लिए कितना प्रयास है? इसे नियमित न करें क्योंकि "उपयोगकर्ता को एक परिवर्तन कारण दर्ज करना होगा" एक नियमित रूप से सहेजने के ऑपरेशन पर, जैसा कि आपने टिप्पणी में लिखा है। एक अस्थायी फ़ाइल या राज्य जैसी किसी चीज़ के बारे में बेहतर सोचें, जो प्रोग्राम क्रैश के बाद स्वचालित रूप से लोड हो सकती है। कई प्रकार के उत्पादकता सॉफ्टवेयर ऐसा करते हैं (उदाहरण के लिए एमएस ऑफिस और लिब्रे ऑफिस दोनों में एक "ऑटोसवे" सुविधा और क्रैश रिकवरी है)।

  • यदि डेटा गलत या दूषित था, तो क्या उपयोगकर्ता इसे आसानी से देख सकता है (हो सकता है कि प्रोग्राम के पुनरारंभ होने के बाद)? यदि हां, तो आप उपयोगकर्ता को डेटा को बचाने के लिए एक विकल्प प्रदान कर सकते हैं (कुछ छोटे मौके के साथ यह भ्रष्ट हो गया है), फिर एक पुनरारंभ को बाध्य करें, इसे पुनः लोड करें और यदि डेटा ठीक दिखता है तो उपयोगकर्ता को जांचने दें। सुनिश्चित करें कि पुराने संस्करण को दूषित करने से बचने के लिए पिछले संस्करण को नियमित रूप से सहेजने के बजाय (एक अस्थायी स्थान / फ़ाइल पर लिखें) को अधिलेखित न करें।

यदि इस तरह की "इंटरमीडिएट बैकअप" रणनीति एक समझदार विकल्प है, तो अंततः आवेदन और इसकी वास्तुकला पर निर्भर करता है, और इसमें शामिल डेटा की प्रकृति और संरचना पर निर्भर करता है। लेकिन अगर उपयोगकर्ता 10 मिनट से भी कम समय तक काम करेगा, और ऐसा दुर्घटना सप्ताह में एक बार या इससे भी अधिक बार होता है, तो मैं शायद इस बारे में बहुत अधिक निवेश नहीं करूंगा।


10
en.wikipedia.org/wiki/Crash-only_software , और यह है कि Android ऐप्स आवश्यकता के अनुसार कैसे काम करते हैं।
मूइंग डक

3
उत्कृष्ट उत्तर - और व्यापक संदर्भ में चीजों पर विचार करने पर एक अच्छा उदाहरण (इस मामले में "हम दुर्घटना के किसी भी मामले में डेटा हानि को कैसे रोक सकते हैं?) बेहतर समाधान की ओर जाता है।
सलेस्के

1
मैंने यह नोट करने के लिए एक छोटा सा संपादन किया कि आपको पुराने डेटा को अधिलेखित नहीं करना चाहिए - आशा है कि आपको कोई आपत्ति नहीं है।
सलेस्के

1
@MingDuck एंड्रॉइड ऐप से बहुत सारे (जैसे गेम) क्रैश पर अपना राज्य खो देते हैं।
user253751

1
@ मिनीबिस: हां, एंड्रॉइड के पास वास्तव में कम गुणवत्ता वाले ऐप की एक बड़ी संख्या है।
मिंग डक

30

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

क्यूं कर?

क्योंकि अब आपको एप्लिकेशन की स्थिति पर कोई विश्वास नहीं हो सकता है।

निश्चित रूप से, उपयोगकर्ता को एक उपयोगी संदेश प्रदान करता है , लेकिन आपको अंततः आवेदन को समाप्त करना चाहिए।

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


मैंने पिछले भाग में आवेदन के बारे में कुछ संदर्भ जानकारी जोड़ने की कोशिश की।
जोनास बेंज

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

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

3
@ मैथ्यू "यदि आप, एप्लिकेशन डेवलपर नहीं जानते हैं कि क्या आप सुरक्षित रूप से जारी रख सकते हैं, तो उपयोगकर्ता कैसे जान सकता है" , डेवलपर को पता नहीं था कि उन्होंने कोड कब लिखा है। जब उपयोगकर्ता इस तरह एक विशिष्ट बग का सामना करता है, तो यह ज्ञात हो सकता है। और उपयोगकर्ता जो भी उपयोगकर्ता फ़ोरम, सपोर्ट चैनल और व्हाट्सएप से पता लगा सकता है, या बस परीक्षण करके और देख सकता है कि उनके डेटा का क्या होता है ... मैं मानता हूँ कि यह अभी भी उपयोगकर्ता सुविधा के रूप में थोड़ा अस्पष्ट और खतरनाक है, बस उस समय को इंगित करता है। उपयोगकर्ता के लिए वास्तव में यह जानना संभव है कि "जारी रखें" समझदार है या नहीं।
हाइड

1
@JonasBenz, विंडोज 3.1 के तहत, डायलॉग बॉक्स दिखाई दिया जब एक प्रोग्राम ने एक अवैध मेमोरी एक्सेस का प्रदर्शन किया, उसमें "अनदेखा" बटन था, जो प्रोग्राम को चालू रखने देता है। आप ध्यान देंगे कि विंडोज के प्रत्येक बाद वाले संस्करण में वह बटन नहीं है।
मार्क

12

यह मानते हुए कि यह एक रासायनिक प्रयोगशाला के लिए है और यह कि आपका एप्लिकेशन सीधे उपकरणों को नियंत्रित नहीं करता है, बल्कि अन्य सेवाओं के माध्यम से करता है:

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

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

संपादित करें:

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


एक राज्य में समाप्ति की आवश्यकता होती है, जो अभी आदेशों का पालन करता है रासायनिक प्रयोगशाला में खतरनाक हो सकता है।
ओलेग वी। वोल्कोव

@ OracleV.Volkov तो शायद समाप्ति पर खुद को पुनः आरंभ करें? जीयूआई शुरू करने वाले एक सभ्य कंप्यूटर पर सैकड़ों मिलीसेकंड शीर्ष के आदेश पर लेना चाहिए। यदि प्रक्रिया के लिए कठिन समय की आवश्यकता होती है तो नियंत्रण को गैर-रीयल टाइम ओएस पर लागू नहीं किया जाएगा। हालांकि यह ओपी है जो अंतिम जोखिम मूल्यांकन करना चाहिए।
जन डोर्नियाक

@ ओलेगवी.वोलकोव हालांकि एक अच्छा बिंदु है, इसलिए मैंने जवाब में इस पर अपनी राय जोड़ी।
जन डोर्नियाक

8

आम तौर पर कार्यक्रम के शीर्ष स्तर पर इस प्रश्न का उत्तर देने की कोशिश करना एक स्मार्ट नाटक नहीं है।

यदि किसी चीज ने सभी तरह से बुदबुदाया है, और आवेदन की वास्तुकला के किसी भी बिंदु पर किसी ने इस मामले पर विचार नहीं किया है, तो आपके पास कोई सामान्यीकरण नहीं है जो आप कर सकते हैं कि क्या क्रियाएं हैं, या लेने के लिए सुरक्षित नहीं हैं।

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

हालाँकि, यदि अनुप्रयोग में इसके उच्च-मान वाले भाग हैं, तो यह तर्क या व्यवहार है जो इस प्रकार की विफलता वसूली को ध्यान में रखते हुए इंजीनियर किया गया है, और इस मामले में उनका लाभ उठाना संभव है, तो हर तरह से, ऐसा करें - उस स्थिति में यह उपयोगकर्ता को यह देखने के लिए संकेत देने के लिए स्वीकार्य हो सकता है कि क्या वे पुनर्प्राप्ति का प्रयास करना चाहते हैं, या यदि वे इसे बस कॉल करना चाहते हैं और शुरू करना चाहते हैं।

इस प्रकार की वसूली आम तौर पर सभी (या यहां तक ​​कि अधिकांश) कार्यक्रमों के लिए आवश्यक या उचित नहीं है, लेकिन, यदि आप एक ऐसे कार्यक्रम पर काम कर रहे हैं जिसके लिए परिचालन अखंडता की इस डिग्री की आवश्यकता होती है, तो यह एक ऐसी परिस्थिति हो सकती है जिसमें इस तरह की उपस्थिति होती है उपयोगकर्ता के लिए संकेत करना एक समझदारी की बात होगी।

किसी विशेष विफलता वसूली तर्क के leiu में - नहीं, यह मत करो। आपको सचमुच पता नहीं है कि क्या होगा, अगर आपने ऐसा किया है, तो आपने अपवाद को और नीचे पकड़ा होगा और उसे संभाला होगा।


दुर्भाग्य से, चीजों के लिए कई तरीके जैसे "किसी स्थान से प्राप्त डेटा के साथ एक ऑब्जेक्ट बनाएँ" अपवादों के बीच कोई अंतर नहीं बनाते हैं जो इंगित करते हैं कि कार्रवाई पूरी नहीं हो सकती है, लेकिन प्रयास का कोई दुष्प्रभाव नहीं था, बनाम जो इंगित करते हैं कि कुछ और अधिक गंभीर है गलत हो गया है तथ्य यह है कि एक संसाधन को लोड करने का प्रयास किसी कारण से विफल हो गया था जिसका अनुमान नहीं था, यदि एक वस्तु के निर्माण में असमर्थता के लिए आम तौर पर तैयार किया जाता है, तो एक घातक त्रुटि को मजबूर नहीं करना चाहिए। जो मायने रखता है वह है दुष्परिणाम, जो दुर्भाग्य से कुछ अपवादों को नजरअंदाज करता है।
सुपरकैट

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

3

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

उस कारण से, आपको आवेदन को समाप्त करना चाहिए।

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

वे इस विचार के साथ सामने आए कि कुछ व्यवस्थाएं क्रैश के बाद क्रमबद्ध रूप से बंद होने के बाद तेजी से शुरू हुईं।

एक अच्छा, हालांकि अब प्रासंगिक उदाहरण नहीं है, फ़ायरफ़ॉक्स के कुछ पुराने संस्करण हैं जो न केवल किसी दुर्घटना से उबरने के दौरान तेजी से शुरू होते हैं, बल्कि इस तरह से एक बेहतर स्टार्टअप अनुभव होता है ! उन संस्करणों में, यदि आप फ़ायरफ़ॉक्स को सामान्य रूप से बंद करते हैं, तो यह सभी खुले टैब को बंद कर देगा और एक सिंगल टैब के साथ शुरू होगा। जबकि दुर्घटना से उबरने के दौरान, यह दुर्घटना के समय खुले टैब को पुनर्स्थापित करेगा। (और यह आपके वर्तमान ब्राउज़िंग संदर्भ को खोए बिना फ़ायरफ़ॉक्स को बंद करने का एकमात्र तरीका था।) तो, लोगों ने क्या किया? उन्होंने फ़ायरफ़ॉक्स को कभी बंद नहीं किया और इसके बजाय हमेशा pkill -KILL firefoxइसे एड किया।

लिनक्स वीकली न्यूज़ पर वैलेरी ऑरोरा द्वारा क्रैश-ओनली सॉफ़्टवेयर के बारे में एक अच्छा राइटअप है । टिप्पणियाँ भी पढ़ने लायक हैं। उदाहरण के लिए, टिप्पणियों में कोई व्यक्ति यह इंगित करता है कि वे विचार नए नहीं हैं, और वास्तव में एर्लांग / ओटीपी आधारित अनुप्रयोगों के डिजाइन सिद्धांतों के बराबर या कम हैं। और, निश्चित रूप से, आज इसे देखते हुए, वैलेरी के 10 साल बाद और मूल लेख के 15 साल बाद, हम देख सकते हैं कि वर्तमान माइक्रो सेवा प्रचार अभी तक फिर से उन्हीं विचारों का आविष्कार कर रहा है। मॉडर्न क्लाउड-स्केल डेटा सेंटर डिज़ाइन भी मोटे अनाज पर एक उदाहरण है। (कोई भी कंप्यूटर सिस्टम को प्रभावित किए बिना किसी भी समय क्रैश कर सकता है।)

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


1

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

acquire lock
try
  update guarded resource
if exception
  invalidate lock
else
  release lock
end try

यदि संरक्षित संसाधन को अद्यतन करते समय एक अप्रत्याशित अपवाद होता है, तो संसाधन को एक भ्रष्ट स्थिति में माना जाना चाहिए, और ताला अमान्य है, भले ही अपवाद एक प्रकार का हो जो अन्यथा सौम्य होगा।

दुर्भाग्य से, जब भी ब्लॉक सामान्य रूप से या असामान्य रूप से बाहर निकलता है, बिना किसी भी तरीके के पहरे के बाहर निकलने पर संसाधन गार्ड के माध्यम से लागू IDisposable/ usingजारी किया जाएगा। इस प्रकार, भले ही अपवाद के बाद जारी रखने के लिए अच्छी तरह से परिभाषित मानदंड हों, लेकिन जब वे लागू होते हैं तो यह बताने का कोई तरीका नहीं है।


+1 केवल इस अपेक्षाकृत गैर-स्पष्ट और अभी भी गैर-सामान्य दृष्टिकोण को व्यक्त करने के लिए कि उचित तरीका क्या है। मुझे वास्तव में अभी तक नहीं पता है कि क्या मैं इससे सहमत हूं, क्योंकि यह मेरे लिए एक उपन्यास है / नियम है, इसलिए मुझे इसे थोड़ी देर के लिए खिसकाना होगा, लेकिन यह बहुत ही बुद्धिमान लगता है।
मत्तुर

0

आप उस दृष्टिकोण का उपयोग कर सकते हैं जो हर एक iOS और MacOS ऐप का अनुसरण करता है: एक अनकहा अपवाद तुरंत एप्लिकेशन को नीचे ले जाता है। प्लस कई त्रुटियां, जैसे सीमा से बाहर सरणी या नए अनुप्रयोगों में सिर्फ अंकगणितीय अतिप्रवाह। कोई चेतावनी नहीं।

मेरे अनुभव में कई उपयोगकर्ता कोई नोटिस नहीं लेते हैं, लेकिन बस ऐप आइकन पर फिर से टैप करें।

जाहिर है आपको यह सुनिश्चित करने की आवश्यकता है कि इस तरह की दुर्घटना महत्वपूर्ण डेटा हानि का कारण नहीं है और निश्चित रूप से महंगी गलतियों का कारण नहीं है। लेकिन एक चेतावनी “आपका ऐप अब दुर्घटनाग्रस्त हो जाएगा। कॉल समर्थन अगर यह आपको परेशान करता है ”किसी की मदद नहीं कर रहा है।

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