जावास्क्रिप्ट त्रुटि से निपटने के लिए सर्वोत्तम अभ्यास क्या हैं?


137

मैं अपने जावास्क्रिप्ट में थोड़ा और अधिक त्रुटि सबूत कमाना शुरू करने के लिए देख रहा हूँ, और मैं का उपयोग करने पर प्रलेखन के बहुत खोजने कर रहा हूँ try, catch, finally, और throw, लेकिन मैं नहीं कब और कहाँ त्रुटियों फेंक पर विशेषज्ञों से सलाह की एक टन की खोज कर रहा हूँ।

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

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

तुम जो भी सुझाव दे सकते हो उसके लिए धन्यवाद!


यह निश्चित रूप से इस बात पर निर्भर करता है कि अगर कुछ गलत हो जाता है और संभावित त्रुटि संदेशों की मात्रा कितनी बढ़ जाती है तो आप कितने शानदार तरीके से विफल हो जाते हैं। आप विफल नहीं होना चाहते क्योंकि आपकी त्रुटि लॉगिंग निर्देशिका अब पूरी हो चुकी है? - क्या आपने यहाँ बिल्कुल देखा? stackoverflow.com/search?q=error+log+javascript
mplungjan

@mplungjan - मैंने वहां जवाबों के माध्यम से स्कैन किया, लेकिन बहुत अधिक विहित नहीं लग रहा था, और जावास्क्रिप्ट त्रुटि को खोजने के लिए खोज / अपवाद सर्वोत्तम प्रथाओं ने कुछ भी नहीं किया, इसलिए मैंने सोचा कि यह मदद करने के लिए सहायक हो सकता है और कुछ संघनित विचारों को हल कर सकता है, मेरे दोनों पर खुद की समझ और भविष्य के खोजकर्ता। शायद यह एक ऐसा विषय है जहां सर्वोत्तम प्रथाओं को निर्धारित करना संभव नहीं है, लेकिन प्रत्येक स्थिति बेहद अनूठी है?
जोशुआ कोडी

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

1
यह एक अच्छा सवाल है, जोश, +1। लॉट सिंटैक्टिक सलाह के आसपास, लेकिन जैसा कि आप कहते हैं कि यह आसान हिस्सा है। यह इस सवाल के जवाब ( stackoverflow.com/questions/2825427/… ) पर छुआ है जहां यह समझाया गया है कि अपवाद जेएस में आमतौर पर उपयोग नहीं किए जाते हैं और कारण दिए जाते हैं।
व्हाइटनीलैंड

जवाबों:


63

एंटरप्राइज जावास्क्रिप्ट एरर हैंडलिंग पर स्लाइड का एक बहुत ही दिलचस्प सेट http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/ पर पाया जा सकता है

संक्षेप में यह संक्षेप में है:

  1. मान लें कि आपका कोड विफल हो जाएगा
  2. सर्वर में लॉग इन करें
  3. आप, ब्राउज़र नहीं, त्रुटियों को संभालें
  4. पहचानें कि त्रुटियाँ कहाँ हो सकती हैं
  5. अपनी त्रुटियों को फेंको
  6. घातक बनाम गैर-घातक त्रुटियों
  7. डिबग मोड प्रदान करें

स्लाइड्स बहुत अधिक विस्तार में जाती हैं और सबसे शायद आपको कुछ दिशा देंगी।

अपडेट करें

ऊपर उल्लिखित प्रस्तुति यहां पाई जा सकती है: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-pretation


24
देवबंदी लिंक टूट गया है।
रयान गेट्स

7
उन लोगों के लिए जो इसे 2017 में पढ़ते हैं, मेरा तर्क है कि आपको स्लाइड से बहुत अधिक मूल्य नहीं मिलेगा - यह सारांश आपको 90% जानकारी देता है। यह अभी भी मूल्यवान जानकारी है। चीयर्स!
फिलिप हेबर्ट

29

याहू के निकोलस ज़कस! प्रसिद्धि ने अजाक्स अनुभव 2008 में एंटरप्राइज एरर हैंडलिंग ( स्लाइड्स ) पर एक बात की , जिसमें उन्होंने कुछ इस तरह का प्रस्ताव दिया:

function log(sev,msg) {
    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

// usage
log(1, "Something bad happened.")

// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
    log(1, msg);
    return true;
}

एक साल बाद, निकोलस ज़कस ने अपने ब्लॉग पर एक अपडेट पोस्ट किया जिसमें आपके उत्पादन वातावरण (स्वचालित रूप से उन्मुख प्रोग्रामिंग का उपयोग करके) पर त्रुटि हैंडलिंग कोड को स्वचालित रूप से इंजेक्ट करने के लिए एक चतुर पैटर्न शामिल था।

जब आप window.error कॉल लॉग करना शुरू करते हैं, तो आप दो चीजों को नोटिस करने जा रहे हैं:

  1. यदि आपकी साइट काफी जटिल है, तो आप बहुत सारी त्रुटियां दर्ज करने जा रहे हैं
  2. आप बेकार "विंडो का एक गुच्छा देख रहे होंगे। अपरिभाषित: 0" संदेशों में

लॉग प्रविष्टियों की धार कम करना सर्वर पर लॉग इन करने से पहले गंभीरता और / या यादृच्छिक संख्या के लिए परीक्षण के रूप में सरल है:

function log(sev,msg) {
    if (Math.random() > 0.1) return; // only log some errors

    var img = new Image();
    img.src = "log.php?sev=" +
        encodeURIComponent(sev) +
        "&msg=" + encodeURIComponent(msg);
}

बेकार "window.error को अपरिभाषित: 0" में हैंडल करना आपकी साइट आर्किटेक्चर पर निर्भर करता है, लेकिन सभी Ajax कॉल्स को पहचानने की कोशिश कर सकते हैं और कुछ फेल होने पर एक अपवाद को फेंक सकते हैं (संभवतः स्टैकट्रेस.जेएस का उपयोग करके स्टैक ट्रेस लौटाते हैं )।


67
मुझे पता है कि यह एक पुराना सवाल है, लेकिन कुछ त्रुटियों को बेतरतीब ढंग से नजरअंदाज करने का सुझाव देना मैंने सबसे बुरे विचारों में से एक है जो मैंने कभी सुना है।
jababey

26
@jbabey: एक छोटी सी साइट के लिए आप सही हैं, लेकिन यदि आप 100,000 या लाखों उपयोगकर्ताओं के साथ एक बड़ी साइट चला रहे हैं, तो आपको वास्तव में अनावश्यक लॉगिंग अनुरोधों के साथ अपने सर्वर (या इंटरनेट) को बाढ़ने की आवश्यकता नहीं है। एक बड़ी पर्याप्त प्रणाली पर, हर वास्तविक त्रुटि दिन में हजारों बार होने वाली होती है, इसलिए सीमित करने का यह रूप ठीक काम करता है। विचार वास्तव में फेसबुक पर लागू किया गया है।
जेन्स रोलैंड

1
डिबगिंग मोड में लॉगिंग त्रुटियों के रूप में उत्पादन त्रुटि रिपोर्ट को सीमित करने के रूप में महत्वपूर्ण है, इसलिए एक ध्यान दें कि लॉगिंग थ्रेशोल्ड को सीमित करने के लिए उस मूल्य को प्रबंधित करने के लिए एक समाधान की आवश्यकता है।
भ्राता

2
@ नाइकबुल I ने 2011-2012 में फेसबुक जावास्क्रिप्ट जावास्क्रिप्ट मॉड्यूल का एक गुच्छा उल्टा किया; यहीं मुझे मिल गया।
जेन्स रोलैंड

1
@ नाइकबुल ने अभी मेरी पुरानी फाइलों की जाँच की, अभी भी ये थी। मैंने फेसबुक बूटलोडर मॉड्यूल में इस ट्रिक को पाया: if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {(यह माना कि कोड सभी त्रुटियों को समाप्त नहीं करता है, केवल टाइमआउट त्रुटियों का एक विशिष्ट वर्ग)
जेन्स रोलैंड

7

IHMO, आपको जावास्क्रिप्ट में त्रुटि हैंडलिंग का उपयोग करना चाहिए जैसे कि आप कई अन्य भाषाओं में करते हैं (AFAIK: Python, Java)।

बेहतर पठनीयता के लिए (और शायद बेहतर प्रदर्शन, भले ही मुझे यकीन नहीं है कि इसका वास्तव में बहुत बड़ा प्रभाव है), आपको निम्नलिखित मामलों में कोशिश / कैच ब्लॉक का उपयोग करना चाहिए:

  • जिस कोड को आप लपेटना चाहते हैं , वह संपूर्ण एल्गोरिथ्म का एक महत्वपूर्ण हिस्सा है । यदि यह विफल रहता है, तो यह हो सकता है:

    • कोड्स के अगले भाग पर त्रुटियां बनाएं (जैसे कि एक var गायब है ...)
    • पृष्ठ को वह न बनाएं जो अपेक्षित हो (सामग्री या सीएसएस पर प्रभाव)
    • उपयोगकर्ता को परिणाम अजीब लगते हैं (कोड व्यवहार पर प्रभाव)
  • आप जानते हैं कि आप जो कोड लिख रहे हैं वह हर ब्राउज़र के अनुकूल नहीं है

  • आपने योजना बनाई कि कोड विफल हो सकता है (क्योंकि यह जांचने का कोई अन्य तरीका नहीं है कि यह काम करना चाहिए अगर ... तब ... ब्लॉक)
  • और यह भी कि जब आप अंतिम उपयोगकर्ता को परेशान किए बिना डिबग करना चाहते हैं

आखिरकार, जावास्क्रिप्ट विशेषज्ञों के पास अन्य तत्व देने के लिए हो सकता है।

बॉक्स में मेरे 2 सेंट,

सादर,

मैक्स


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

5

अन्य उत्तरों के अलावा: एक महत्वपूर्ण बात जावास्क्रिप्ट त्रुटि वस्तुओं और फ़ंक्शन मापदंडों में उपलब्ध संदर्भ डेटा का उपयोग करना है window.onerror

स्टैकट्रेस (errorObject.stack), फ़ाइल नाम, लाइन नंबर और कॉलम नंबर जैसी चीजें। ध्यान दें कि प्रत्येक ब्राउज़र में कुछ अंतर होते हैं ... इसलिए अच्छी त्रुटियों को प्राप्त करने के लिए अपना सर्वश्रेष्ठ प्रयास करें।

यहां तक ​​कि कंसोल ऑब्जेक्ट के साथ समस्याएं भी हो सकती हैं । मैं इस कोड से प्रेरित किसी भी मानक त्रुटि ऑब्जेक्ट का पता लगाने के लिए इस एक से प्रेरित एक कस्टम window.onerror फ़ंक्शन और एक विशेष फ़ंक्शन का उपयोग करता हूं ।

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

उपयोग करने से भी बचें throw 'My message', उपयोग करें throw new Error('My message'), यहां तक ​​कि आपके पास कस्टम त्रुटियां भी हो सकती हैं, इस लेख को पढ़ें ।

त्रुटियों (हमेशा संस्करण, ऑब्जेक्ट की आईडी, कुछ कस्टम संदेश, ...) के लिए कुछ संदर्भ जोड़ें और यह भी सुनिश्चित करें कि आप बाहरी त्रुटियों (कुछ बाहरी डेटा या परिस्थिति ने आपके सिस्टम को विफल कर दिया) और आंतरिक त्रुटियों के बीच अंतर करते हैं / अभिकथन (आपका अपना सिस्टम गड़बड़ा गया), ' डिजाइन बाय कॉन्ट्रैक्ट ' के बारे में पढ़ें ।

यहाँ एक गाइड है

इंटरसेप्टर की तरह सामान्य त्रुटि हैंडलिंग का उपयोग करने के बारे में भी सोचें, जो आपके लिबास और फ्रेमवर्क हैं:

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