প্রতিশ্রুতি ধরায় ত্রুটি বাড়ানো


92

আমি একটি টিউটোরিয়ালে নিম্নলিখিত কোডটি পেয়েছি:

promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});

আমি কিছুটা বিভ্রান্ত: ধরা কল কি কিছু অর্জন করে? আমার কাছে মনে হয় এর কোনও প্রভাব নেই, কারণ এটি কেবল একই ত্রুটিটি ছুঁড়েছিল যা ধরা পড়েছিল। আমি কীভাবে নিয়মিত চেষ্টা / ক্যাপচার কাজ করে তা ভিত্তি করে রেখেছি


আপনি টিউটোরিয়াল একটি লিঙ্ক প্রদান করতে পারেন? হতে পারে এমন অতিরিক্ত প্রসঙ্গ রয়েছে যা সহায়ক হবে ...
ইগোর

@ ইগোর আমি পারছি না, এটি বহুবচন এ। এটি সম্ভবত কিছু ত্রুটি হস্তান্তর যুক্ত করার জন্য একটি স্থানধারক?
টাইলার ডারডেন

এটিই আমি অনুমান করব যেহেতু এটি আরও কিছু না করে ত্রুটিটি কলারের সাথে পাস করবে যা ক্যাপচারটি শুরু না করেই সম্পন্ন হতে পারে।
ইগোর

4
@ টিলারডুরডেন আমার সন্দেহ হয় যে আপনি এটির স্থানধারক হিসাবে সঠিক correct
জ্যারেড স্মিথ

@ টাইলারডুরডেন, আমিও অনুমান করতে পারি যে এটি কোনও স্থানধারক। সম্ভবত কীভাবে ত্রুটিগুলি ফর্ম্যাট করতে / স্বাভাবিক করতে হয় তা প্রদর্শনের চেষ্টা করছি। মূলত প্রতিশ্রুতির সমতুল্য try { ... }catch(error){ throw new Error("something went wrong") }। বা প্রতিশ্রুতি এবং ত্রুটিগুলি সামঞ্জস্যপূর্ণ (কমপক্ষে প্রায় সেই পথে) উপযুক্ত তা দেখাতে । তবে এর বর্তমান বাস্তবায়নে এটি কেবল বোকা। আপনি ঠিক বলেছেন, এটি কোনও কাজ করে না এবং এটি উত্তরাধিকার সূত্রে ক্লাসে ওভাররাইটিং সক্ষম করার জন্য আপনি ওওপিতে যোগ করার মতো একটি হুকের মতোও নয়। এটি কিছু করার সাথে সাথে আমি ক্যাচ-ব্লকটি যুক্ত করব তবে এটি কেবল স্থানধারক হিসাবে নয়।
টমাস

উত্তর:


129

নগ্ন ক্যাচ দেওয়ার কোনও অর্থ নেই এবং আপনি যেমন দেখায় তেমন নিক্ষিপ্ত নয়। এটি কোড যুক্ত এবং ধীর সম্পাদন ছাড়া দরকারী কিছু করে না। সুতরাং, আপনি যদি আবার যাচ্ছেন .catch()এবং পুনর্নির্মাণ করেন তবে এর মধ্যে আপনি যা করতে চান তা এমন কিছু হওয়া উচিত .catch(), অন্যথায় আপনার কেবল .catch()পুরোপুরি অপসারণ করা উচিত ।

সেই সাধারণ কাঠামোর স্বাভাবিক বিষয় হ'ল যখন আপনি কোনও কিছু কার্যকর করতে .catch()যেমন যেমন ত্রুটিটি লগ করতে চান বা কোনও রাজ্য (বন্ধ ফাইলগুলির মতো) পরিষ্কার করতে চান তবে আপনি প্রতিশ্রুতি চেইনটিকে প্রত্যাখ্যান হিসাবে চালিয়ে যেতে চান।

promise.then(function(result){
    //some code
}).catch(function(error) {
    // log and rethrow 
    console.log(error);
    throw error;
});

একটি টিউটোরিয়ালে, এটি কেবলমাত্র লোকদের দেখানোর জন্য যেখানে তারা ত্রুটিগুলি ধরতে পারে বা ত্রুটিটি পরিচালনা করার ধারণাটি শিখিয়ে দিতে পারে, তারপরে এটিকে আবার নতুন করে দেখানো।


ধরা ও পুনর্বিবেচনার কয়েকটি দরকারী কারণ নিম্নরূপ:

  1. আপনি ত্রুটিটি লগ করতে চান তবে প্রতিশ্রুতি বাতিল হিসাবে বাতিল করুন।
  2. আপনি ত্রুটিটিকে অন্য কোনও ত্রুটিতে পরিণত করতে চান (প্রায়শই চেইনের শেষে সহজে ত্রুটি প্রক্রিয়াকরণের জন্য)। এই ক্ষেত্রে, আপনি একটি ভিন্ন ত্রুটি পুনর্বিবেচনা করবেন।
  3. প্রতিশ্রুতি শৃঙ্খলা চলার আগে আপনি একগুচ্ছ প্রক্রিয়াজাতকরণ করতে চান (যেমন ঘনিষ্ঠ / নিখরচায় সংস্থানসমূহ) তবে আপনি প্রতিশ্রুতি চেইন প্রত্যাখ্যানিত থাকতে চান।
  4. আপনি যদি কোনও ব্যর্থতা দেখা দেয় তবে প্রতিশ্রুতি শৃঙ্খলে এই সময়ে ডিবাগারের জন্য ব্রেকপয়েন্ট রাখার জন্য একটি জায়গা চান ।

তবে, ক্যাচ হ্যান্ডলারের অন্য কোনও কোড সহ একই ত্রুটির একটি সরল ক্যাথ এবং পুনর্নবীকরণ কোডটি স্বাভাবিকভাবে চালনার জন্য কোনও কার্যকর কাজ করে না।


আমার মতে এটি ভাল উদাহরণ নয়। এই জাতীয় পদ্ধতির সাথে আপনি সহজেই 1 ত্রুটির জন্য একাধিক লগিং পান। জাভাতে আপনি কেবল জানতে পারবেন throw new Exception(periousException);না জাভাস্ক্রিপ্ট নেস্টেড ত্রুটি সমর্থন করে কিনা, তবে যাইহোক "লগ এবং থ্রো" খারাপ অভ্যাস।
চেরি

27
@ চেরি - আপনি বলতে পারবেন না যে এটি সাধারণভাবে একটি খারাপ অভ্যাস। এমন সময় আছে যখন মডিউল তার নিজস্ব ত্রুটিগুলি নিজস্ব উপায়ে লগ করতে চায় এবং এটি করার একটি উপায় এটি। তদুপরি, আমি এটি প্রস্তাব দিচ্ছি না, আমি কেবল ব্যাখ্যা করছি যে এর কোনও কারণ নেই .catch()এবং ক্যাচের ভিতরে একই ত্রুটি নিক্ষেপ করার কোনও কারণ নেই যদি না আপনি অন্য কোনও কিছু না করেন .catch()। এই উত্তর এর পয়েন্ট।
jender00

সাধারণত ব্যতিক্রমগুলি অ্যাবস্ট্রাকশন স্তরের ফিট করে। উদাহরণস্বরূপ একটি ডিবি সম্পর্কিত ব্যতিক্রম ধরা পুরোপুরি ঠিক আছে, এবং "পরিষেবা" ব্যতিক্রমের মতো এমন কোনও কিছু ফেলুন যা কলার দ্বারা পরিচালিত হবে। এটি বিশেষত কার্যকর যখন আপনি নিম্ন-স্তরের ব্যতিক্রম সম্পর্কে বিশদ প্রকাশ করবেন না
ম্যাকট্রিয়ালফায়ার

4
ধরার এবং (কখনও কখনও) নিক্ষেপ করার আরও একটি ভাল কারণ হ'ল নির্দিষ্ট ত্রুটিটি পরিচালনা করা, তবে অন্য সমস্ত কিছু পুনরায় পাঠানো।
জ্যাস্পার

4
@ সিমোনজাইক্স - হ্যাঁ, এটির .finally()জন্য খুব দরকারী হতে পারে তবে কখনও কখনও অ-ত্রুটিযুক্ত পথে ইতিমধ্যে সংস্থানগুলি যত্ন নেওয়া হয় তাই .catch()এগুলি বন্ধ করার জায়গা এখনও রয়েছে। এটি সত্যই পরিস্থিতির উপর নির্ভর করে।
jਫਰ00

16

উভয় .then()এবং .catch()পদ্ধতি প্রতিশ্রুতি ফেরত দেয় এবং আপনি উভয় হ্যান্ডলারের মধ্যে একটি ব্যতিক্রম ছুঁড়ে ফেললে, প্রত্যাশিত প্রতিশ্রুতি প্রত্যাখ্যান করা হয় এবং ব্যতিক্রমটি পরবর্তী প্রত্যাখ্যাত হ্যান্ডলারের হাতে ধরা পড়বে।

নিম্নলিখিত কোডে, আমরা প্রথমটিতে একটি ব্যতিক্রম ছুঁড়ে ফেলি .catch()যা দ্বিতীয়টিতে ধরা পড়ে .catch():

new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');
        
    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
});

দ্বিতীয়টি .catch()একটি প্রতিশ্রুতি প্রদান করে যা পূরণ হয়, .then()হ্যান্ডলারটি বলা যেতে পারে:

new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');
        
    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
})
.then(() => {
    console.log('Show this message whatever happened before');
});

দরকারী রেফারেন্স: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/User_promises#Chaining_ after_a_catch

আশাকরি এটা সাহায্য করবে!


4

আপনি যদি catchপদ্ধতিটি কলটি পুরোপুরি ছেড়ে দেন তবে কোনও গুরুত্বপূর্ণ পার্থক্য নেই ।

এটি যুক্ত করা কেবলমাত্র একটি অতিরিক্ত মাইক্রোটাস্ক, যার ব্যবহারিক প্রয়োগের অর্থ আপনি এই প্রতিশ্রুতিটি পরে প্রত্যাখ্যানের বিষয়টি লক্ষ্য করবেন, কোনও catchশর্ত ছাড়াই ব্যর্থ হওয়া একটি প্রতিশ্রুতির ক্ষেত্রে ।

পরবর্তী স্নিপেট এটি দেখায়:

var p;
// Case 1: with catch
p = Promise.reject('my error 1')
       .catch(function(error) {
          throw(error);
       });

p.catch( error => console.log(error) );
// Case 2: without catch
p = Promise.reject('my error 2');

p.catch( error => console.log(error) );

প্রথম প্রত্যাখ্যানের আগে কীভাবে দ্বিতীয় প্রত্যাখ্যানের প্রতিবেদন করা হয়েছে তা নোট করুন। এটিই কেবলমাত্র পার্থক্য সম্পর্কে।


3

সুতরাং মনে হচ্ছে আপনার প্রশ্নটি হ'ল, "প্রতিশ্রুতিতে, .catch()পদ্ধতিটি কী করে?"

https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / স্ট্যাটমেন্টস / থ্রো

থ্রো স্টেটমেন্ট "থামবে (থ্রোকের পরে বিবৃতি কার্যকর হবে না), এবং কল স্ট্যাকের প্রথম ক্যাচ ব্লকে নিয়ন্ত্রণ সরবরাহ করা হবে cal

প্রতিশ্রুতি শৃঙ্খলে, .then()পদ্ধতিটি কিছু ধরণের ডেটা অংশকে ফিরিয়ে দেবে। খণ্ডের এই প্রত্যাবর্তন প্রতিশ্রুতি পূর্ণ করবে। ডেটার সফল প্রত্যাবর্তন প্রতিশ্রুতি পূর্ণ করে। আপনি .catch()পদ্ধতিটি একইভাবে ভাবতে পারেন । .catch()তবে অসফল তথ্য পুনরুদ্ধার পরিচালনা করবে। নিক্ষেপ বিবৃতি প্রতিশ্রুতি পূর্ণ। কখনও কখনও, আপনি বিকাশকারীদের ব্যবহার দেখতে পাবেন .catch((err) => {console.log(err))} যা প্রতিশ্রুতি শৃঙ্খলাও সম্পূর্ণ করবে complete


0

আপনার আসলে এটিকে ফেলে দেওয়ার দরকার নেই, কেবল প্রতিশ্রুতি। খালি ছেড়ে দিন নইলে এটি বাতিল হওয়াটিকে হ্যান্ডেল হিসাবে বিবেচনা করবে এবং তারপরে কোডটিকে চেষ্টা করে মোড়ানোর চেষ্টা করবে এবং এটি ত্রুটি স্বয়ংক্রিয়ভাবে ধরা পড়বে যা নিচে যাচ্ছে।

try{
  promise.then(function(result){
    //some code
  }).catch(function(error) {
    //no need for re throwing or any coding. but leave this as this otherwise it will consider as un handled
  });
}catch(e){
  console.log(e);
  //error can handle in here
}

0

প্রতিশ্রুতি শৃঙ্খলে,। ক্যাচ ব্যবহার করা ভাল

প্রাক্তন ফাংশন এফ 2:। তারপর (...)। ক্যাচ (ই => প্রত্যাখ্যান (ই));

  • পরীক্ষা 1 - চেষ্টা করুন
  • পরীক্ষা 2 - চেষ্টা বা। ক্যাচ ছাড়াই
  • টেস্ট3 -। ক্যাচ সহ

function f1() {
    return new Promise((resolve, reject) => {
        throw new Error('test');
    });
}

function f2() {
    return new Promise((resolve, reject) => {
        f1().then(value => {
            console.log('f1 ok ???');
        }).catch(e => reject(e));
    });
}

function test1() {
    console.log('test1 - with try catch - look in F12');
    try {
      f2().then(() => { // Uncaught (in promise) Error: test
        console.log('???'); });
    } catch (e) {
      console.log('this error dont catched');
    }
}

function test2() {
    console.log('test2 - without try or .catch - look in F12');
    f2(); // Uncaught (in promise) Error: test
}

function test3() {
  console.log('test3 - with .catch');
  f2().then(value => {
    console.log('??');
  }).catch(e => {
    console.log(' now its ok, error ', e);
  })
}

setTimeout(() => { test1(); 
  setTimeout(() => { test2(); 
    setTimeout(() => { test3(); 
    }, 100);
  }, 100);
}, 100);

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