`थ्रो न्यू एरर` और` थ्रो थ्री ऑबजेक्ट` में क्या अंतर है?


378

मैं एक सामान्य त्रुटि हैंडलर लिखना चाहता हूं जो कोड के किसी भी उदाहरण पर उद्देश्य से फेंके गए कस्टम त्रुटियों को पकड़ लेगा।

जब मुझे throw new Error('sample')निम्न कोड पसंद आया

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

फ़ायरफ़ॉक्स में लॉग शो के रूप में Error: [object Object]और मैं वस्तु पार्स नहीं कर सका।

दूसरे के throwलिए लॉग शो के रूप में:Error: hehe

जबकि जब मैंने किया

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

कंसोल के रूप Object { hehe="haha"}में दिखाया गया है: जिसमें मैं त्रुटि गुणों तक पहुंचने में सक्षम था।

अंतर क्या है?

क्या कोड में देखा गया अंतर है? जैसे स्ट्रिंग को ऑब्जेक्ट के रूप में केवल स्ट्रिंग और ऑब्जेक्ट के रूप में पारित किया जाएगा लेकिन वाक्यविन्यास अलग होगा?

मैंने थ्रोइंग एरर ऑब्जेक्ट नहीं खोजा है ... मैंने केवल स्ट्रिंग्स फेंकने का काम किया था।

क्या उपरोक्त दो तरीकों के अलावा कोई अन्य तरीका है?


6
नई त्रुटि ({प्रोप: वैल}) फेंकने की समस्या यह है कि त्रुटि का एक वैध निर्माण नहीं है। हेमंत द्वारा चर्चा की गई के रूप में त्रुटि गुण ज्ञात है।
अनुदान

जवाबों:


216

यहाँ त्रुटि ऑब्जेक्ट के बारे में और अपनी त्रुटियों को फेंकने के बारे में एक अच्छी व्याख्या है

त्रुटि वस्तु

बस क्या हम एक त्रुटि की स्थिति में इसे से निकाल सकते हैं? सभी ब्राउज़रों में त्रुटि ऑब्जेक्ट निम्न दो गुणों का समर्थन करता है:

  • नाम: त्रुटि का नाम, या अधिक विशेष रूप से, निर्माणकर्ता का नाम त्रुटि का है।

  • संदेश: त्रुटि का विवरण, इस विवरण के साथ ब्राउज़र पर निर्भर करता है।

छह संभावित मूल्यों को नाम संपत्ति द्वारा वापस किया जा सकता है, जो त्रुटि के निर्माणकर्ताओं के नामों के अनुरूप है। वो हैं:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

अपनी खुद की त्रुटियों (अपवादों को फेंकना)

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


4
अरे हाँ। यह एक अच्छा सामान है जो मैंने यह सवाल पूछने से पहले याद किया। वैसे भी इससे संबंधित जानकारी खोजने वाले उपयोगकर्ता साफ़ हो जाएंगे। अब मैं स्पष्ट हूँ कि क्या है। :) धन्यवाद। मैं कुछ दिनों में मतदान करने के लिए वापस आ जाऊंगा।
जयपाल चंद्रन

184
क्या अब तक इस सवाल का जवाब नहीं दिया गया है?
user9993

@ user9993 उपयोगकर्ता हो पूछा प्रश्न उस समय चैट के अनुसार विस्तृत समझ की तलाश में था, इसलिए तदनुसार उत्तर प्रदान किया गया है और उपयोगकर्ता के लिए उपयोगी है। यही कारण है कि स्वीकार किए जाते हैं और अधिकांश वोटों के लिए।
हेमंत मेटलिया

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

और मूल प्रश्न का उत्तर देने के लिए, जावास्क्रिप्ट के लिए कोई फर्क नहीं पड़ता। हालांकि, Error(और उपवर्ग) का उपयोग सम्मेलन द्वारा किया जाता है। वे डिफ़ॉल्ट रूप से भी एक स्टैक प्रॉपर्टी प्रदान करते हैं, हालांकि इसे मैन्युअल रूप से किसी अन्य में जोड़ा जा सकता है। तो यह वास्तव में ज्यादातर सम्मेलन है, जो आप फेंकते हैं, उस throwपर कार्यक्रम प्रवाह प्रभावित नहीं होता है, बस आप सभी मामलों में। आप throw "grandmother down the stairs";एक ही काम कर सकते हैं , सिवाय इसके कि एक संलग्न स्टैक ट्रेस और एरर हैंडलिंग फ़ंक्शंस नहीं होगा, पत्रकारों, डीबगर्स को उम्मीद है Error, या जो गुण आते हैं, वे अधिक सटीक होंगे।
मोरे

104

थ्रो "आई एम ईविल"

throwआगे निष्पादन को समाप्त करेगा और त्रुटि को पकड़ने पर संदेश स्ट्रिंग को उजागर करेगा ।

try {
  throw "I'm Evil"
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e); //I'm Evil
}

फेंकने के बाद सांत्वना कभी भी समाप्ति का कारण नहीं बनेगी।


नई त्रुटि फेंक ("मैं बहुत प्यारा हूँ")

throw new Errorदो परम नाम और संदेश के साथ एक त्रुटि घटना को उजागर करता है । यह आगे के निष्पादन को भी समाप्त करता है

try {
  throw new Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); //Error, I'm Evil
}


16
"थ्रो एरर ('जो भी हो)" और "थ्रो नई एरर (' जो भी हो)" के बीच के अंतर के बारे में क्या है - दोनों काम करते हैं।
joedotnot

9
त्रुटि कार्यात्मक है, नई त्रुटि एक निर्माता है। दोनों एक ही डेवलपर में
करते हैं। pmillailla.org/en-US/docs/Web/JavaScript/Reference/…

5
@ निश्चयचंदानी मुझे यह अजीब लगता है कि इस तरह की अशोभनीय और गलत टिप्पणी को हवा मिलती है। दोनों "त्रुटि कार्यात्मक है", और न ही "नई त्रुटि एक निर्माता है" कोई मतलब नहीं है और / या गलत हैं। उस संदर्भ में यह स्पष्ट नहीं है कि लिंक "साबित" करने के लिए क्या माना जाता है। यह एमडीएन पृष्ठ के लिए है Error, ठीक है, टिप्पणी का कनेक्शन कहां है? ओपी के सवाल का जवाब देने और जवाब देने वाले आधे लोगों को सिर्फ चुप रहना चाहिए था।
मोरे

@ मोर इस खंड Used as a functionको इस लिंक से देखें ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Nishchit Dhanani

ठीक है मैं समझ गया। यह एक समारोह है
निश्चिंत धनानी

73

निम्नलिखित लेख शायद कुछ और विस्तार में जाता है, जो एक बेहतर विकल्प है; throw 'An error'या throw new Error('An error'):

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

यह बताता है कि बाद वाला ( new Error()) अधिक विश्वसनीय है, क्योंकि इंटरनेट एक्सप्लोरर और सफारी (संस्करणों का अनिश्चित) जैसे ब्राउज़र पूर्व का उपयोग करते समय संदेश को सही ढंग से रिपोर्ट नहीं करते हैं।

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


36

आप पहली बार इस कोड का उल्लेख करते हैं:

throw new Error('sample')

और फिर अपने पहले उदाहरण में आप लिखते हैं:

throw new Error({'hehe':'haha'}) 

पहली त्रुटि ऑब्जेक्ट वास्तव में काम करेगा, क्योंकि यह एक स्ट्रिंग मान की उम्मीद कर रहा है, इस मामले में 'नमूना'। दूसरा नहीं होगा क्योंकि आप किसी ऑब्जेक्ट को पास करने की कोशिश कर रहे हैं, और यह एक स्ट्रिंग की उम्मीद कर रहा है।

त्रुटि ऑब्जेक्ट में "संदेश" गुण होगा, जो 'नमूना' होगा।


12
दूसरा काम करता है, बस बहुत उपयोगी तरीके से नहीं। इसमें toString()पारित वस्तु पर विधि निष्पादित होती है, जिसके परिणामस्वरूप [object Object]त्रुटि हुई (जैसा कि ओप ने लिखा है)।
cjn


15

आप throwवस्तु के रूप में कर सकते हैं

throw ({message: 'This Failed'})

तो अपने में उदाहरण के लिए try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

या सिर्फ एक स्ट्रिंग त्रुटि फेंकें

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string

15

Errorनिर्माता एक त्रुटि वस्तु बनाने के लिए प्रयोग किया जाता है। रनटाइम त्रुटियां होने पर त्रुटि ऑब्जेक्ट फेंक दिए जाते हैं। त्रुटि ऑब्जेक्ट का उपयोग उपयोगकर्ता-परिभाषित अपवादों के लिए आधार ऑब्जेक्ट के रूप में भी किया जा सकता है।

उपयोगकर्ता-परिभाषित त्रुटियां throwबयान के माध्यम से डाली गई हैं । कार्यक्रम नियंत्रण catchकॉल स्टैक में पहले ब्लॉक को पारित किया जाएगा ।

त्रुटि ऑब्जेक्ट के साथ और उसके बिना त्रुटि फेंकने के बीच का अंतर:


throw {'hehe':'haha'};

क्रोम devtools में इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

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


throw new Error({'hehe':'haha'}); 

क्रोम devtools में इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

जब हम इसका विस्तार करते हैं तो एरर ऑब्जेक्ट के साथ फेंकी गई एक त्रुटि हमें एक स्टैक ट्रेस देती है। यह हमें बहुमूल्य जानकारी देता है जहां त्रुटि ठीक से आई है जो अक्सर आपके कोड को डीबग करते समय मूल्यवान जानकारी होती है। आगे ध्यान दें कि त्रुटि कहती है [object Object], यह इसलिए है क्योंकि Errorनिर्माणकर्ता पहले तर्क के रूप में एक संदेश स्ट्रिंग की अपेक्षा करता है। जब यह एक वस्तु प्राप्त करता है तो यह इसे एक स्ट्रिंग में ले जाएगा।


2

प्रतिक्रिया व्यवहार

बाकी जवाबों के अलावा, मैं रिएक्ट में एक अंतर दिखाना चाहूंगा।

यदि मैं फेंक देता हूं new Error()और मैं विकास मोड में हूं, तो मुझे एक त्रुटि स्क्रीन और कंसोल लॉग मिलेगा। यदि मैं एक स्ट्रिंग शाब्दिक फेंक देता हूं, तो मैं इसे केवल कंसोल में देखूंगा और संभवतः इसे याद करूंगा, अगर मैं कंसोल लॉग नहीं देख रहा हूं।

उदाहरण

कंसोल में एक त्रुटि लॉग फेंकता है और विकास मोड में एक त्रुटि स्क्रीन दिखाता है (स्क्रीन उत्पादन में दिखाई नहीं देगा)।

throw new Error("The application could not authenticate.");

प्रतिक्रिया में त्रुटि स्क्रीन

जबकि निम्न कोड केवल कंसोल में लॉग होता है:

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