জাভাস্ক্রিপ্টে catch catch ক্যাচ ছাড়া}} সম্ভব?


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 {}ব্লক অনুপস্থিত ।

আমি জেএসফিডালে একটি উদাহরণ রেখেছি

সুতরাং, catchসেই একই ব্লকগুলি একই প্রভাব অর্জনের সাথে মুছে ফেলার কোনও উপায় আছে কি ?

উত্তর:


4

না। আপনি তাদের রাখতে হবে।

এটি আসলে বোধগম্য হয় যেহেতু ত্রুটিগুলি একেবারে এড়ানো উচিত নয়।


16
nullreturn func1() || func2() || func3();
সেক্ষেত্রে

52
এই উত্তরটি সত্যই ভুল, আপনি স্ট্যাকওভারফ্লোtry {}; finally {} . com
ড্যানিয়েল এক্স মুর

4
@ দানিএলএক্সমুর, ছাড়া এই 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}}}?
ব্যবহারকারী 2284570

1
উপরের মন্তব্যটি ওকে সঠিকভাবে উত্তর দেয় না কারণ ফাংশন 1 সফল হলে তিনি ফাংশন 2 চালাতে চান না।
অ্যান্ড্রু স্টিৎস 6'18


আপনাকে ধন্যবাদ যা আমার প্রয়োজন ছিল :-) এটি চেষ্টা করেও যদি এটি কাজ করে তবে তা সত্যিই দুর্দান্ত হবে} mean আমি বলতে চাই: async () => {ইঙ্গিত ওয়ার্কআইএনপ্রোগ্রেস () পাইপলাইনস্টেপ 1 () পাইপলাইনস্টেপ 2 () অপেক্ষা করুন ... অবশেষে {স্টপ ইন্ডিকেটর ( )}} এটি পরিষ্কার হয়ে যাবে যে পুরো ফাংশনটি বোঝানো হয়েছে ;-) যারা চেষ্টা করে এমন ব্লকগুলি সেখানে খুব কুৎসিত ...
লেনি

35

ES2019 দিয়ে কোনও ত্রুটি ভেরিয়েবল ছাড়াই খালি ক্যাচ ব্লক পাওয়া সম্ভব । একে alচ্ছিক ক্যাচ বাইন্ডিং বলা হয় এবং এটি জুন 2018 এ প্রকাশিত ভি 8 ভি 6.6 এ কার্যকর করা হয়েছিল । নোড 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. ত্রুটি ধরা। ৩. finallyব্লকটি কার্যকর করে। 4. ত্রুটি নিক্ষেপ। এটা কি সঠিক?
হেলসনট

ধন্যবাদ @ হেলসন্ট দ্বিতীয় কোডের নমুনায় মৃত্যুদন্ড কার্যকর করার আদেশ সম্পর্কে, আমি নিশ্চিত নই যে ত্রুটিটি ধরা পড়ে আবার নিক্ষেপ করা হয়েছে, বা কেবল (সম্ভবত) কেবল নিক্ষেপ করা হয়েছে এবং প্রথম স্থানে ধরা পড়েনি (যেহেতু নেই catch) তবে কেউ তা বলতে পারে ।অন্য try/ দিয়ে পুরো কোডটি ঘিরে ফেলুনcatch এবং আপনি This WILL get loggedত্রুটিটি ধরতে সক্ষম হবেন ।
ড্যান ড্যাসক্লেস্কু

দেখতে এখন অনেকটাই পরিষ্কার। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
লিওন - হ্যান লি

10

না, catch(বা finally) tryএর বন্ধু এবং চেষ্টা / ধরার অংশ হিসাবে সর্বদা সেখানে ।

তবে এগুলি খালি রাখা যেমন আপনার উদাহরণের মতো সঠিকভাবে বৈধ।

আপনার উদাহরণ কোডের মন্তব্যে ( যদি ফানক 1 ত্রুটি ছুড়ে মারে, ফানক 2 চেষ্টা করুন ), মনে হবে আপনি যা করতে চান তা catchপূর্ববর্তী ব্লকের অভ্যন্তরের পরবর্তী ফাংশনটিকে কল করা উচিত ।


1
আপনি ঠিক বলেছেন। তবে কোডের মতো কোডটি যদি try {...}; try {...}সম্ভব হয় তবে কোডটির অর্থ পরিষ্কার হতে পারে (প্রথম চেষ্টা করুন, অন্যথায় দ্বিতীয়টি চেষ্টা করুন)।
pimvdb

আপনার সম্পাদনা সম্পর্কে: জেএসফিডাল উদাহরণে, দ্বিতীয় ফাংশনটি কিছু ফিরিয়ে দেয়, তৃতীয় কার্যটি কি সেই ক্ষেত্রে সত্যই মূল্যায়ন করা হয়? আমি ভেবেছিলাম এর returnপরে কোনও বিবৃতি আসা বন্ধ করে দেয়।
pimvdb

@ Pimvdb দুঃখিত, আমি কোলাহলটি পরীক্ষা করি নি returnফাংশন অসময়ে ফিরে আসবে। আমি আমার উত্তর আপডেট করব।
অ্যালেক্স

1
এই উত্তরটি সত্যই ভুল, আপনি স্ট্যাকওভারফ্লোtry {}; finally {} . com
ড্যানিয়েল এক্স মুর

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
আজব এই পাঁচটি বছর পরে যখন আমার উত্তরগুলি একই জিনিস বলে তখন খনিটি অবনমিত হয়েছিল d খনিটি কেবলমাত্র নিম্নমানের ছিল বলে মনে হয়। মডারেটর, দয়া করে নোট নিন।
duffymo

টিসিএল-তে খুব সুবিধাজনক একক-শব্দের কনস্ট্রাক্ট রয়েছেcatch {my code}
এমকামা


কেন? অবশেষে চেষ্টা না করা হলে অকেজো মনে হয়।
duffymo

1

আমি ভিন্ন কোণ থেকে উপস্থাপিত সমস্যাটি দেখার সিদ্ধান্ত নিয়েছি।

আমি অন্য মন্তব্যকারী দ্বারা তালিকাভুক্ত অ-হ্যান্ডেল ত্রুটি বস্তুটিকে সম্বোধন করার সময় অনুরোধ করা কোডের ধরণটির জন্য ঘনিষ্ঠভাবে অনুমতি দেওয়ার একটি উপায় নির্ধারণ করতে সক্ষম হয়েছি।

কোডটি দেখা যাবে @ http://jsfiddle.net/Abyssoft/RC7Nw/4/

চেষ্টা করুন: লুপের জন্য ক্যাপচারটি গ্রেফসাল ফলসটি দিয়ে দেয়। প্রয়োজনীয় সমস্ত ফাংশনগুলির মাধ্যমে পুনরাবৃত্তি করতে সক্ষম হয়ে being যখন সুস্পষ্ট ত্রুটি পরিচালনার দরকার হয় তখন অতিরিক্ত ফাংশন অ্যারে ব্যবহার করা হয়। ত্রুটি হ্যান্ডলারের উপাদান সহ ত্রুটি এবং ক্রিয়ামূলক অ্যারে এমনকি কোনও ফাংশন নয়, ত্রুটিটি কনসোলে ফেলে দেওয়া হয়।

এখানে স্ট্যাকওভারফ্লোর প্রয়োজনীয়তাগুলি হ'ল কোড ইনলাইন [জেএসলিন্টকে অনুগত করার জন্য সম্পাদিত (নিশ্চিত করার জন্য নেতৃস্থানীয় স্থানগুলি সরান), পঠনযোগ্যতা উন্নত করুন]

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 {} . com
ড্যানিয়েল এক্স মুর


-2

যেহেতু ES2019 আপনি সহজেই ব্যবহার করতে পারেন try {}ছাড়া catch {}:

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

আরও তথ্যের জন্য দয়া করে মাইকেল ফিককারার প্রস্তাবটি দেখুন


1
না, catchএখনও প্রয়োজনীয়, এটি কেবল আবশ্যক নয় যে আবশ্যক নয় ...
চিপিত 24
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.