जावास्क्रिप्ट में {} बिना पकड़ {} संभव है?


114

मेरे पास कई फ़ंक्शन हैं जो या तो कुछ वापस करते हैं या एक त्रुटि फेंकते हैं। एक मुख्य फ़ंक्शन में, मैं इनमें से प्रत्येक को कॉल करता हूं, और प्रत्येक फ़ंक्शन द्वारा लौटाए गए मान को वापस करना चाहता हूं, या यदि पहले फ़ंक्शन में कोई त्रुटि होती है, तो दूसरे फ़ंक्शन पर जाएं।

तो मूल रूप से मेरे पास वर्तमान में क्या है:

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

लेकिन वास्तव में मैं tryइसे वापस करने के लिए (यानी अगर यह एक त्रुटि नहीं है) करना चाहते हैं। मुझे catchब्लॉक की जरूरत नहीं है । हालाँकि, कोड की तरह try {}विफल रहता है क्योंकि यह एक (अप्रयुक्त) catch {}ब्लॉक याद कर रहा है ।

मैंने jsFiddle पर एक उदाहरण दिया ।

तो, क्या उन catchब्लॉकों को हटाने का कोई तरीका है जो समान प्रभाव को प्राप्त करते हुए हटाए जाते हैं?

जवाबों:


4

नहीं, आपको उन्हें रखना होगा।

यह वास्तव में समझ में आता है क्योंकि त्रुटियों को चुपचाप अनदेखा नहीं किया जाना चाहिए।


16
उस स्थिति में उन कार्यों को त्रुटियों को नहीं फेंकना चाहिए, लेकिन उदाहरण के लिए वापस लौटें nullऔर आप कुछ ऐसा करेंreturn func1() || func2() || func3();
ThiefMaster

52
यह उत्तर तथ्यात्मक रूप से गलत है, try {}; finally {}जैसा कि आपने stackoverflow.com/a/5764505/68210
डैनियल एक्स मूर

4
@DanielXMoore, के बिना catch (e) {}, अपवाद द्वारा फेंका गया प्रयास करने से func1()रोका जाएगा func2()
21

65
यह कभी-कभी एक खाली पकड़ होने का सही अर्थ देता है, इसलिए मैं आपके तर्क से सहमत नहीं हूं।
पेट्र पेलर

8
यह उत्तर तथ्यात्मक रूप से गलत और भ्रामक है। "यह वास्तव में समझ में आता है" आप कहते हैं, लेकिन आप गलत हैं, यह केवल कुछ मामलों में समझ में आता है और दूसरों को नहीं। यह बेवजह स्वीकार किए जा रहे भयानक जवाब का एक बड़ा उदाहरण है। ऐसे कई मामले हैं जहां यह समझ में नहीं आता है कि कोई पकड़ ब्लॉक नहीं है, जैसे कि एक asyncफ़ंक्शन में, कभी-कभी। खाली catchखंड बनाने के लिए जावास्क्रिप्ट भाषा द्वारा मजबूर किया जाना स्पष्ट रूप से व्यर्थ है।
युंगगुन

236

एक पकड़ खंड के बिना एक प्रयास अगले उच्च पकड़ , या खिड़की पर अपनी त्रुटि भेजता है , अगर उस कोशिश के भीतर कोई पकड़ परिभाषित नहीं है।

यदि आपके पास एक पकड़ नहीं है , तो एक कोशिश अभिव्यक्ति को अंत में क्लॉज की आवश्यकता होती है ।

try {
    // whatever;
} finally {
    // always runs
}

तो सबसे अच्छा तरीका होगा कि आप कुछ लिखें try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}?
user2284570

1
उपरोक्त टिप्पणी ओपी का सटीक उत्तर नहीं देती है क्योंकि वह फ़ंक्शन 1 को सफल होने पर फ़ंक्शन 2 को चलाना नहीं चाहता है।
एंड्रयू स्टिट्ज


धन्यवाद कि मुझे इसकी क्या आवश्यकता है :-) यह वास्तव में बहुत बढ़िया होगा यदि यह बिना कोशिश के भी काम करता है {} मेरा मतलब है: async () => {poinWorkInProgress () प्रतीक्षारत पाइपलाइनस्टेप 1 () प्रतीक्षारत पाइपलाइनस्टेप 2 () ... {{stopIndicator ( )}} यह स्पष्ट होगा कि पूरे समारोह का मतलब; ;-) उन कोशिश ब्लॉक वहाँ बहुत बदसूरत हैं ...
Lenny

35

ES2019 से शुरू होने वाले एरर वेरिएबल के बिना एक खाली कैच ब्लॉक होना संभव है । इसे वैकल्पिक कैच बाइंडिंग कहा जाता है और इसे V8 v6.6 में लागू किया गया था , जो जून 2018 में जारी किया गया था । यह सुविधा नोड 10 , क्रोम 66 , फ़ायरफ़ॉक्स 58 , ओपेरा 53 और सफारी 11.1 के बाद से उपलब्ध है

सिंटैक्स नीचे दिखाया गया है:

try {
  throw new Error("This won't show anything");
} catch { };

आपको अभी भी एक catchब्लॉक की आवश्यकता है , लेकिन यह खाली हो सकता है और आपको किसी भी चर को पारित करने की आवश्यकता नहीं है। यदि आप कैच ब्लॉक बिल्कुल नहीं चाहते हैं, तो आप try/ का उपयोग कर सकते हैं finally, लेकिन ध्यान दें कि यह त्रुटियों को निगल नहीं सकता क्योंकि एक खाली कैच करता है।

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}


2
यह उत्तर सबसे पुराना है! निष्पादन आदेश के संदर्भ में, 1. यह tryब्लॉक का प्रयास करता है। 2. त्रुटि पकड़ता है। 3. finallyब्लॉक को निष्पादित करता है। 4. त्रुटि फेंकता है। क्या ये सही है?
हेल्सोंट

साभार @helsont दूसरे कोड के नमूने में निष्पादन आदेश के लिए, मुझे यकीन नहीं है कि कोई यह बता सकता है कि क्या त्रुटि पकड़ी गई है और फिर से फेंक दी गई है, या बस (शायद) पहले ही फेंक दिया गया है और पकड़ा नहीं गया है (क्योंकि कोई नहीं है catch)। एकtrycatch और के साथ पूरे कोड को घेरें / और आप This WILL get loggedत्रुटि को पकड़ने में सक्षम होंगे ।
डेन डैस्कलेस्कु

अब बहुत साफ दिखता है। साझा करने के लिए धन्यवाद!
LeOn - हान ली

10

नहीं, catch(या finally) tryदोस्त और हमेशा कोशिश / पकड़ने के हिस्से के रूप में वहाँ है ।

हालाँकि, उन्हें अपने उदाहरण की तरह, खाली रखना पूरी तरह से मान्य है।

आपके उदाहरण कोड की टिप्पणियों में ( यदि func1 त्रुटि फेंकता है, func2 का प्रयास करें ), तो ऐसा लगेगा कि आप वास्तव में जो करना चाहते हैं catchवह पिछले के ब्लॉक के अंदर अगले फ़ंक्शन को कॉल करना है ।


1
तुम सही हो। हालाँकि यदि कोड जैसा try {...}; try {...}संभव होगा, कोड का अर्थ स्पष्ट हो सकता है (पहले प्रयास करें, अन्यथा दूसरा प्रयास करें)।
pvvdb

अपने संपादन के बारे में: JSFiddle उदाहरण में, दूसरा फ़ंक्शन कुछ देता है, तो क्या उस मामले में तीसरे फ़ंक्शन का वास्तव में मूल्यांकन किया जाता है? मुझे लगा कि एक returnबयान के बाद कुछ भी आना बंद हो जाता है।
pimvdb

@pimvdb क्षमा करें, मैंने फ़िडल की जाँच नहीं की। returnसमारोह समय से पहले लौटने का कारण होगा। मैं अपना जवाब अपडेट करूंगा।
एलेक्स

1
यह उत्तर तथ्यात्मक रूप से गलत है, try {}; finally {}जैसा कि आपने stackoverflow.com/a/5764505/68210
डैनियल एक्स मूर

1
@ डैनियल एक्समोर श्योर, यह है, लेकिन finally{}मूल रूप से उसी भावना के रूप में है catch{}। मैं जवाब अपडेट कर दूंगा।
एलेक्स

6

मैं कोशिश कर सकता हूं कि बिना पकड़ के अंत में कोशिश न करूं, क्योंकि अगर दोनों ही ब्लॉक को ब्लॉक कर देते हैं और अंत में थ्रो को ब्लॉक कर देते हैं, तो आखिरकार क्लॉज में डाली गई त्रुटि बबल हो जाती है और ट्राई ब्लॉक की त्रुटि नजरअंदाज कर दी जाती है, मेरे अपने टेस्ट में:

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

परिणाम:

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error

1

वे हर भाषा में एक साथ चलते हैं जो मुझे पता है कि उनमें (जावास्क्रिप्ट, जावा, सी #, सी ++) है। यह मत करो।


1
अजीब बात है कि मेरा पांच साल बाद अपमानित किया गया था जब यह वही बात कहता है जो अन्य उत्तरों के समान है। खदान केवल एक ही प्रतीत होती है जिसे नीचे गिरा दिया गया था। मॉडरेटर, कृपया ध्यान दें।
duffymo

Tcl में एक बहुत ही सुविधाजनक एकल-शब्द निर्माण हैcatch {my code}
MKaama


क्यों? बेकार लगता है, जब तक कि यह कोशिश न हो / अंत में।
duffymo

1

मैंने एक अलग कोण से प्रस्तुत समस्या को देखने का निर्णय लिया है।

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

कोड @ http://jsfiddle.net/Abyssoft/RC7Nw/4/ देखा जा सकता है

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

स्टैकओवरफ़्लो की आवश्यकताओं के अनुसार यहाँ कोड इनलाइन है [जेएसएलआईटी को आज्ञाकारी बनाने के लिए संपादित किया गया है (पुष्टि करने के लिए प्रमुख स्थान हटा दें), सुधार क्षमता में सुधार]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));


1

यदि आप केवल फ़ंक्शन 2 और 3 चाहते हैं, तो यदि कोई त्रुटि होती है, तो आप उन्हें कैच ब्लॉक में क्यों नहीं डाल रहे हैं?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}

0

मेरा मानना ​​है कि आपको हेल्पर फ़ंक्शन का उपयोग करने की आवश्यकता है जैसे:

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}

और इसका उपयोग करें:

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);

-2

कोशिश और पकड़ एक सिक्के के 2 पक्ष की तरह हैं। ऐसा बिना कोशिश के संभव नहीं है।


5
यह उत्तर तथ्यात्मक रूप से गलत है, try {}; finally {}जैसा कि आपने stackoverflow.com/a/5764505/68210
डैनियल एक्स मूर


-2

ES2019 के बाद से आप आसानी से try {}बिना उपयोग कर सकते हैं catch {}:

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

अधिक जानकारी के लिए कृपया माइकल फिकारा के प्रस्ताव को देखें


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