নোড.জেএস সেরা অনুশীলন ব্যতিক্রম হ্যান্ডলিং


755

আমি কিছুদিন আগে নোড.জেএস চেষ্টা করেছিলাম। আমি বুঝতে পেরেছি যে যখনই আমার প্রোগ্রামটিতে আমি একটি নিয়ন্ত্রণহীন ব্যতিক্রম পাই নোডটি সমাপ্ত হয়। এটি সাধারণ সার্ভারের ধারক থেকে পৃথক যে আমার সামনে প্রকাশিত হয়েছিল যেখানে কেবলমাত্র কর্মী থ্রেড মারা যায় যখন অনিচ্ছাকৃত ব্যতিক্রম ঘটে এবং ধারকটি এখনও অনুরোধটি গ্রহণ করতে সক্ষম হবে। এটি কয়েকটি প্রশ্ন উত্থাপন করে:

  • এর process.on('uncaughtException')বিরুদ্ধে রক্ষা করার একমাত্র কার্যকর উপায়?
  • process.on('uncaughtException')অ্যাসিক্রোনাস প্রক্রিয়াগুলি কার্যকর করার সময়ও কি অযৌক্তিক ব্যতিক্রম ধরা পড়বে?
  • এমন কোনও মডিউল আছে যা ইতিমধ্যে নির্মিত (যেমন ইমেল প্রেরণ বা কোনও ফাইলে লেখার মতো) যা আমি ব্যতীত ব্যতিক্রমগুলির ক্ষেত্রে উত্তোলন করতে পারি?

আমি এমন কোনও পয়েন্টার / নিবন্ধের প্রশংসা করব যা আমাকে নোড.জেএস-এ অপ্রয়োজনীয় ব্যতিক্রমগুলি পরিচালনা করার জন্য সাধারণ সেরা অনুশীলনগুলি দেখায়


11
অপ্রকাশিত ব্যতিক্রম ঘটবে না। যদি তারা এমন কোনও প্রোগ্রাম ব্যবহার করে যা আপনার সম্পূর্ণ অ্যাপ্লিকেশনটির ক্র্যাশ হয়ে যাওয়ার সময় পুনরায় চালু করে (নোডেমন, চিরকালের জন্য, সুপারভাইজার)
রায়নস

116
Uncaught ব্যতিক্রম সবসময়, যদি না আপনি করা ঘটতে পারে যে আপনার অ্যাসিঙ্ক্রোনাস কোড ভিতরে টুকরা try .. catch, এবং চেক এই জন্য সম্পন্ন করা হয় আপনার সব লিব
ড্যান

13
+1 ড্যান প্রথমে আমি ভেবেছিলাম আপনার সমস্ত লিবগুলি কিছুটা অতিরঞ্জিত ছিল, কারণ চেষ্টা / ক্যাশে কোডটিতে আপনার সমস্ত "থ্রেড এন্ট্রি পয়েন্ট" আবদ্ধ করা দরকার " তবে আরও যত্ন সহকারে চিন্তা করে, কোনও লিবিতে এমন এক setTimeoutবা setIntervalএকরকম কিছু গভীর গভীর কবর দেওয়া যেতে পারে যা আপনার কোড দ্বারা ধরা যায় না।
ইউজিন বেরেসভস্কি

8
@ ইউজেনবিরেসভাক্সি ড্যান ঠিক আছে তবে এটি এই সত্যটি পরিবর্তন করে না যে যখন অপ্রকাশিত ধারণাগুলি ঘটে তখন অ্যাপ্লিকেশনটি পুনরায় চালু করা একমাত্র নিরাপদ বিকল্প। অন্য কথায় আপনার অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে গেছে এবং এটি করার বা করার বা করার মতো কিছুই নেই। আপনি যদি নতুনটি বাস্তবায়নের জন্য গঠনমূলক কিছু করতে চান এবং এখনও পরীক্ষামূলকভাবে v0.8 ডোমেন বৈশিষ্ট্যটি ব্যবহার করতে পারেন যাতে আপনি ক্র্যাশটি লগইন করতে পারেন এবং আপনার ক্লায়েন্টকে একটি 5XX প্রতিক্রিয়া পাঠাতে পারেন।
অস্টেরগার্ড

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

উত্তর:


736

আপডেট: জয়েন্টের এখন তাদের নিজস্ব গাইড রয়েছে । নিম্নলিখিত তথ্যগুলি সংক্ষেপে আরও:

নিরাপদে "নিক্ষেপ" ত্রুটি

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

  • সিঙ্ক্রোনাস কোডের জন্য, যদি কোনও ত্রুটি ঘটে তবে ত্রুটিটি ফিরে দিন:

    // Define divider as a syncrhonous function
    var divideSync = function(x,y) {
        // if error condition?
        if ( y === 0 ) {
            // "throw" the error safely by returning it
            return new Error("Can't divide by zero")
        }
        else {
            // no error occured, continue on
            return x/y
        }
    }
    
    // Divide 4/2
    var result = divideSync(4,2)
    // did an error occur?
    if ( result instanceof Error ) {
        // handle the error safely
        console.log('4/2=err', result)
    }
    else {
        // no error occured, continue on
        console.log('4/2='+result)
    }
    
    // Divide 4/0
    result = divideSync(4,0)
    // did an error occur?
    if ( result instanceof Error ) {
        // handle the error safely
        console.log('4/0=err', result)
    }
    else {
        // no error occured, continue on
        console.log('4/0='+result)
    }
  • কলব্যাক-ভিত্তিক (অর্থাত্ অ্যাসিঙ্ক্রোনাস) কোডের জন্য, কলব্যাকের প্রথম যুক্তিটি হ'ল err, ত্রুটি ঘটলে ত্রুটি হয় err, যদি ত্রুটি না ঘটে তবে তা errহয় null। অন্য কোনও যুক্তি যুক্তি অনুসরণ করে err:

    var divide = function(x,y,next) {
        // if error condition?
        if ( y === 0 ) {
            // "throw" the error safely by calling the completion callback
            // with the first argument being the error
            next(new Error("Can't divide by zero"))
        }
        else {
            // no error occured, continue on
            next(null, x/y)
        }
    }
    
    divide(4,2,function(err,result){
        // did an error occur?
        if ( err ) {
            // handle the error safely
            console.log('4/2=err', err)
        }
        else {
            // no error occured, continue on
            console.log('4/2='+result)
        }
    })
    
    divide(4,0,function(err,result){
        // did an error occur?
        if ( err ) {
            // handle the error safely
            console.log('4/0=err', err)
        }
        else {
            // no error occured, continue on
            console.log('4/0='+result)
        }
    })
  • জন্য ঘটনাবহুল কোড, যেখানে ত্রুটি পরিবর্তে ত্রুটি নিক্ষেপ জন্য যে কোন জায়গায় ঘটতে পারে, আগুন errorঘটনা পরিবর্তে :

    // Definite our Divider Event Emitter
    var events = require('events')
    var Divider = function(){
        events.EventEmitter.call(this)
    }
    require('util').inherits(Divider, events.EventEmitter)
    
    // Add the divide function
    Divider.prototype.divide = function(x,y){
        // if error condition?
        if ( y === 0 ) {
            // "throw" the error safely by emitting it
            var err = new Error("Can't divide by zero")
            this.emit('error', err)
        }
        else {
            // no error occured, continue on
            this.emit('divided', x, y, x/y)
        }
    
        // Chain
        return this;
    }
    
    // Create our divider and listen for errors
    var divider = new Divider()
    divider.on('error', function(err){
        // handle the error safely
        console.log(err)
    })
    divider.on('divided', function(x,y,result){
        console.log(x+'/'+y+'='+result)
    })
    
    // Divide
    divider.divide(4,2).divide(4,0)

নিরাপদে "ধরা" ত্রুটি

যদিও কখনও কখনও, এমন কোড থাকতে পারে যা অন্য কোথাও একটি ত্রুটি ছুঁড়ে দেয় যা যদি আমরা এটিকে নিরাপদে না ধরি তবে আমাদের প্রয়োগের সম্ভাব্য ক্র্যাশ হতে পারে। আমাদের কোড আর্কিটেকচারের উপর নির্ভর করে আমরা এটি ধরার জন্য নিম্নলিখিত পদ্ধতির একটি ব্যবহার করতে পারি:

  • যখন আমরা জানি ত্রুটিটি কোথায় ঘটছে, আমরা সেই বিভাগটি একটি নোড.জেএস ডোমেনে গুটিয়ে রাখতে পারি

    var d = require('domain').create()
    d.on('error', function(err){
        // handle the error safely
        console.log(err)
    })
    
    // catch the uncaught errors in this asynchronous or synchronous code block
    d.run(function(){
        // the asynchronous or synchronous code that we want to catch thrown errors on
        var err = new Error('example')
        throw err
    })
  • যদি আমরা জানি যে ত্রুটিটি কোথায় ঘটছে তা হল সিঙ্ক্রোনাস কোড এবং যে কোনও কারণেই ডোমেনগুলি ব্যবহার করতে পারে না (সম্ভবত নোডের পুরানো সংস্করণ), আমরা ট্র্যাচ ক্যাথ স্টেটমেন্টটি ব্যবহার করতে পারি:

    // catch the uncaught errors in this synchronous code block
    // try catch statements only work on synchronous code
    try {
        // the synchronous code that we want to catch thrown errors on
        var err = new Error('example')
        throw err
    } catch (err) {
        // handle the error safely
        console.log(err)
    }

    তবে, try...catchঅ্যাসিক্রোনাস কোডটি ব্যবহার না করার বিষয়ে সতর্কতা অবলম্বন করুন , কারণ একটি অ্যাসিঙ্ক্রোনাস নিক্ষেপ করা ত্রুটি ধরা পড়বে না:

    try {
        setTimeout(function(){
            var err = new Error('example')
            throw err
        }, 1000)
    }
    catch (err) {
        // Example error won't be caught here... crashing our app
        // hence the need for domains
    }

    আপনি যদি try..catchঅ্যাসিক্রোনাস কোডের সাথে কাজ করতে চান , নোড .4.৪ বা তার async/awaitথেকেও বেশি চলার সময় আপনি আপনার অ্যাসিনক্রোনাস ফাংশন লিখতে স্থানীয়ভাবে ব্যবহার করতে পারেন ।

    আরেকটি বিষয় সম্পর্কে সতর্কতা অবলম্বন করা try...catchহ'ল tryবিবৃতিতে আপনার সমাপ্তি কলব্যাকটি মোড়ানো ঝুঁকি :

    var divide = function(x,y,next) {
        // if error condition?
        if ( y === 0 ) {
            // "throw" the error safely by calling the completion callback
            // with the first argument being the error
            next(new Error("Can't divide by zero"))
        }
        else {
            // no error occured, continue on
            next(null, x/y)
        }
    }
    
    var continueElsewhere = function(err, result){
            throw new Error('elsewhere has failed')
    }
    
    try {
            divide(4, 2, continueElsewhere)
            // ^ the execution of divide, and the execution of 
            //   continueElsewhere will be inside the try statement
    }
    catch (err) {
            console.log(err.stack)
            // ^ will output the "unexpected" result of: elsewhere has failed
    }

    এই কোডটি আপনার কোডটি আরও জটিল হয়ে ওঠায় খুব সহজ। এই হিসাবে, হয় ডোমেন ব্যবহার করা বা ত্রুটিগুলি ফিরিয়ে আনা উত্তম (1) অ্যাসিঙ্ক্রোনাস কোড (2) ব্যতীত ব্যতিক্রম (2) আপনি এটি না চান তা কার্যকর করার চেষ্টা করুন execution যে ভাষাগুলিতে জাভাস্ক্রিপ্টের অ্যাসিনক্রোনাস ইভেন্ট-মেশিন স্টাইলের পরিবর্তে যথাযথ থ্রেডিংয়ের অনুমতি দেওয়া হয়েছে, এটি কোনও ইস্যুতে কম নয়।

  • শেষ অবধি, এমন ক্ষেত্রে যেখানে কোনও ডোমেন বা একটি ট্র্যাচ স্টেটমেন্টের মোড়কে আবদ্ধ ছিল না এমন জায়গায় অবিচ্ছিন্ন ত্রুটি ঘটে, আমরা uncaughtExceptionশ্রোতার সাহায্যে আমাদের অ্যাপ্লিকেশনটিকে ক্রাশ না করে দিতে পারি (তবে এটি করার ফলে অ্যাপ্লিকেশনটি অজানা অবস্থায় রাখতে পারে) ):

    // catch the uncaught errors that weren't wrapped in a domain or try catch statement
    // do not use this in modules, but only in applications, as otherwise we could have multiple of these bound
    process.on('uncaughtException', function(err) {
        // handle the error safely
        console.log(err)
    })
    
    // the asynchronous or synchronous code that emits the otherwise uncaught error
    var err = new Error('example')
    throw err

5
ধন্যবাদ রায়নোস, আপডেট হয়েছে। আপনার কি এমন উত্স আছে যা এর কুফলগুলি ব্যাখ্যা করে try catch? আমি প্রমাণ সহ যে ব্যাক আপ করতে চাই। সিঙ্ক উদাহরণ উদাহরণস্বরূপ।
বালুপটন

2
এই উত্তর আর বৈধ নয়। ডোমেনগুলি এই সমস্যাটি সমাধান করে (নোড.জেএস দ্বারা প্রস্তাবিত)
গ্যাব্রিয়েল লামাস

5
@ বালুপটন ত্রুটিগুলি ত্রুটি পরিচালনার জন্য নিক্ষেপ করা উচিত। তাদের অবশ্যই এড়ানো উচিত নয়। তাদের সম্পর্কে এমন কিছুই নেই যা অ্যাপ্লিকেশনটির কার্য সম্পাদন বা অন্য কোনও কিছু ভেঙে দেয়। ব্যতিক্রমগুলির জন্য জাভা এবং অন্যান্য আধুনিক ভাষাগুলির দুর্দান্ত সমর্থন রয়েছে। এখানে কিছু দুর্গন্ধযুক্ত পোস্ট পড়ার পরে আমার একমাত্র উপসংহারটি হ'ল লোকেরা এগুলিকে খুব ভালভাবে বুঝতে পারে না এবং তাই তাদের ভয় হয়। ভয় অনিশ্চিত সন্দেহ। এই বিতর্কটি কমপক্ষে 20 বছর আগে ব্যতিক্রমের পক্ষে সিদ্ধান্ত নেওয়া হয়েছিল।
enl8enmentnow

22
এখন আইও.জেএস দ্বারা ডোমেনগুলি হ্রাস করা হয়েছে : " এই মডিউলটি অবমূল্যায়ন মুলতুবি রয়েছে Once একবার প্রতিস্থাপনের এপিআই চূড়ান্ত হয়ে গেলে, এই মডিউলটি পুরোপুরি হ্রাস করা হবে ... ব্যবহারকারীদের অবশ্যই ডোমেনগুলি সরবরাহ করে এমন কার্যকারিতা থাকতে হবে তবে আপাতত এটির উপর নির্ভর করতে পারে তবে ভবিষ্যতে অন্য কোনও সমাধানে স্থানান্তরিত হওয়া উচিত বলে আশা করা উচিত।
টিমোথি গু

5
ডোমেইন API বর্তমানে অবচিত হয়েছে ? তারা একটি প্রতিস্থাপনের এপিআই উল্লেখ করেছে - এটি কখন প্রকাশিত হবে তা যে কেউ জানেন এবং এটি দেখতে কেমন হবে?
আপক্রিক

95

নীচে নির্বাচিত ব্লগ পোস্টগুলির কোড উদাহরণ এবং কোট সহ এই বিষয়টির বিভিন্ন সূত্রের সংক্ষিপ্তসার এবং ক্রিউশন রয়েছে। সেরা অনুশীলনের সম্পূর্ণ তালিকা এখানে পাওয়া যাবে


নোড.জেএস ত্রুটি পরিচালনার সেরা অনুশীলন


সংখ্যা 1: অ্যাসিঙ্ক ত্রুটি পরিচালনার জন্য প্রতিশ্রুতি ব্যবহার করুন

টিএল; ডিআর: কলব্যাক শৈলীতে অ্যাসিঙ্ক ত্রুটিগুলি পরিচালনা করা সম্ভবত জাহান্নামের দ্রুততম পথ (ডুমের পিরামিড ওরফে)। আপনি আপনার কোডটিতে সেরা উপহারটি দিতে পারেন তার পরিবর্তে একটি নামী প্রতিশ্রুতি গ্রন্থাগার ব্যবহার করা হচ্ছে যা চেষ্টা করার মতো অনেক কমপ্যাক্ট এবং পরিচিত কোড সিনট্যাক্স সরবরাহ করে

অন্যথায়: নুড.জেএস কলব্যাক শৈলী, ফাংশন (ত্রুটি, প্রতিক্রিয়া), নৈমিত্তিক কোড, অতিরিক্ত বাসা বাঁধা এবং বিশ্রী কোডিং নিদর্শনগুলির সাথে ত্রুটি পরিচালনা করার মিশ্রণের কারণে অ-রক্ষণাবেক্ষণযোগ্য কোডের প্রতিশ্রুতিবদ্ধ উপায় is

কোড উদাহরণ - ভাল

doWork()
.then(doWork)
.then(doError)
.then(doWork)
.catch(errorHandler)
.then(verify);

কোড উদাহরণ বিরোধী প্যাটার্ন - কলব্যাক শৈলীর ত্রুটি পরিচালনা ling

getData(someParameter, function(err, result){
    if(err != null)
      //do something like calling the given callback function and pass the error
    getMoreData(a, function(err, result){
          if(err != null)
            //do something like calling the given callback function and pass the error
        getMoreData(b, function(c){ 
                getMoreData(d, function(e){ 
                    ...
                });
            });
        });
    });
});

ব্লগের উদ্ধৃতি: "প্রতিশ্রুতি নিয়ে আমাদের সমস্যা আছে" ("নোড প্রতিশ্রুতি" কীওয়ার্ডগুলির জন্য ব্লগ পাউচডিবি, ১১ নম্বরে)

"... এবং প্রকৃতপক্ষে কলব্যাকগুলি আরও ভয়াবহ কিছু করে: এগুলি আমাদের স্ট্যাক থেকে বঞ্চিত করে, যা আমরা সাধারণত প্রোগ্রামিং ভাষায় মর্যাদাবোধ করি। স্ট্যাক ছাড়াই রাইটিং কোড অনেকটা ব্রেক প্যাডেল ছাড়াই গাড়ি চালানোর মতো: আপনি আপনি যতটা খারাপভাবে এটির প্রয়োজন তা বুঝতে পারবেন না, যতক্ষণ না আপনি এটির জন্য পৌঁছান এবং এটি সেখানে না promises প্রতিশ্রুতির পুরো বিন্দুটি হ'ল আমরা যখন অ্যাসিঙ্কে গিয়েছিলাম তখন আমরা যে ভাষার মূলসূত্রগুলি হারিয়েছিলাম তা ফিরিয়ে দেওয়া: ফিরে আসুন, নিক্ষেপ করুন এবং স্ট্যাক করুন you তবে আপনি প্রতিশ্রুতিগুলির সদ্ব্যবহারের জন্য কীভাবে সঠিকভাবে ব্যবহার করতে হয় তা জানতে হবে "


সংখ্যা 2: কেবল বিল্ট-ইন ত্রুটি অবজেক্টটি ব্যবহার করুন

টিএল; ডিআর: স্ট্রিং হিসাবে বা কাস্টম ধরণের হিসাবে ত্রুটিগুলি ছুঁড়ে এমন কোডটি দেখতে খুব সাধারণ - এটি ত্রুটিটি পরিচালনা করার যুক্তিকে এবং মডিউলগুলির মধ্যে আন্তঃব্যবহারকে জটিল করে তোলে। আপনি কোনও প্রতিশ্রুতি প্রত্যাখ্যান করুন, ব্যতিক্রম নিক্ষেপ করুন বা ত্রুটি নির্গত করুন - নোড.জেএস অন্তর্নির্মিত ত্রুটিযুক্ত বস্তুটি ব্যবহার করে অভিন্নতা বৃদ্ধি করে এবং ত্রুটির তথ্য হ্রাস রোধ করে

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

কোড উদাহরণ - এটি সঠিকভাবে করা

    //throwing an Error from typical function, whether sync or async
 if(!productToAdd)
 throw new Error("How can I add new product when no value provided?");

//'throwing' an Error from EventEmitter
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));

//'throwing' an Error from a Promise
 return new promise(function (resolve, reject) {
 DAL.getProduct(productToAdd.id).then((existingProduct) =>{
 if(existingProduct != null)
 return reject(new Error("Why fooling us and trying to add an existing product?"));

কোড উদাহরণ বিরোধী প্যাটার্ন

//throwing a String lacks any stack trace information and other important properties
if(!productToAdd)
    throw ("How can I add new product when no value provided?");

ব্লগের উক্তি: "একটি স্ট্রিং কোনও ত্রুটি নয়" (ব্লগ ডেথচিট থেকে, "নোড.জেএস এরর ত্রুটিযুক্ত বিষয়" কীওয়ার্ডের জন্য 6 তম স্থানে রয়েছে)

"... মডিউল মধ্যে হ্রাস ইনটেরোপিরাবিলিটি একটি ত্রুটি ফলাফল পরিবর্তে একটি স্ট্রিং ক্ষণস্থায়ী। এটি API গুলি যে ত্রুটি চেক instanceof করণ করা যেতে পারে, বা যে ত্রুটি সম্পর্কে আরো জানতে চান চুক্তিপত্রে ভঙ্গ । ত্রুটি বস্তু, হিসাবে আমরা দেখতে পাবেন, খুব আছে আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলির আকর্ষণীয় বৈশিষ্ট্যগুলি কনস্ট্রাক্টরকে দেওয়া বার্তাটি ধরে রাখার পাশাপাশি .. "


সংখ্যা 3: কর্মক্ষম বনাম প্রোগ্রামার ত্রুটিগুলি পার্থক্য করুন

টিএল; ডিআর: অপারেশন ত্রুটি (উদাহরণস্বরূপ এপিআই একটি অবৈধ ইনপুট পেয়েছে) এমন ত্রুটিযুক্ত প্রভাবগুলিকে পুরোপুরি বোঝা যায় এবং চিন্তার সাথে পরিচালনা করা যায় এমন পরিচিত ক্ষেত্রে উল্লেখ করে। অন্যদিকে, প্রোগ্রামার ত্রুটি (উদাহরণস্বরূপ অপরিজ্ঞাত ভেরিয়েবলটি পড়ার চেষ্টা করা) অজানা কোড ব্যর্থতাগুলিকে বোঝায় যা অ্যাপ্লিকেশনটি দক্ষতার সাথে পুনরায় আরম্ভ করার নির্দেশ দেয়

অন্যথায়: কোনও ত্রুটি দেখা দিলে আপনি সর্বদা অ্যাপ্লিকেশনটি পুনঃসূচনা করতে পারেন, তবে কেন একটি গৌণ এবং পূর্বাভাসযুক্ত ত্রুটির কারণে (অপারেশনাল ত্রুটি) ~ 5000 অনলাইন ব্যবহারকারীকে বঞ্চিত করবেন? বিপরীতটিও আদর্শ নয় - অজানা সমস্যা (প্রোগ্রামার ত্রুটি) দেখা দিলে অ্যাপ্লিকেশনটি রাখা অপ্রত্যাশিত আচরণের কারণ হতে পারে। দু'জনের পার্থক্যটি দক্ষতার সাথে অভিনয় করতে এবং প্রদত্ত প্রসঙ্গে ভিত্তিতে ভারসাম্যযুক্ত পদ্ধতির প্রয়োগের অনুমতি দেয়

কোড উদাহরণ - এটি সঠিকভাবে করা

    //throwing an Error from typical function, whether sync or async
 if(!productToAdd)
 throw new Error("How can I add new product when no value provided?");

//'throwing' an Error from EventEmitter
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));

//'throwing' an Error from a Promise
 return new promise(function (resolve, reject) {
 DAL.getProduct(productToAdd.id).then((existingProduct) =>{
 if(existingProduct != null)
 return reject(new Error("Why fooling us and trying to add an existing product?"));

কোড উদাহরণ - ক্রিয়াকলাপ হিসাবে চিহ্নিত একটি ত্রুটি চিহ্নিত করা (বিশ্বস্ত)

//marking an error object as operational 
var myError = new Error("How can I add new product when no value provided?");
myError.isOperational = true;

//or if you're using some centralized error factory (see other examples at the bullet "Use only the built-in Error object")
function appError(commonType, description, isOperational) {
    Error.call(this);
    Error.captureStackTrace(this);
    this.commonType = commonType;
    this.description = description;
    this.isOperational = isOperational;
};

throw new appError(errorManagement.commonErrors.InvalidInput, "Describe here what happened", true);

//error handling code within middleware
process.on('uncaughtException', function(error) {
    if(!error.isOperational)
        process.exit(1);
});

ব্লগের উক্তি : "অন্যথায় আপনি রাষ্ট্রের ঝুঁকি নিয়ে যান" (ব্লগ ডিবাগযোগ্য থেকে, "নোড.জেএস ব্যতীত ব্যতীত" কীওয়ার্ডগুলির জন্য 3 স্থান পেয়েছে)

" ... জাভাস্ক্রিপ্টে নিক্ষেপ কীভাবে কাজ করে তার প্রকৃতি অনুসারে, রেফারেন্স ফাঁস না করে বা অন্য কোনও সংজ্ঞায়িত ভঙ্গুর অবস্থা তৈরি না করে নিরাপদে" আপনি যেখানে গিয়েছিলেন সেখানে তুলে নেওয়ার "কোনও উপায় নেই। সাড়া দেওয়ার সবচেয়ে নিরাপদ উপায় প্রক্রিয়াটি বন্ধ করে দেওয়া একটি ত্রুটিযুক্ত ত্রুটি । অবশ্যই একটি সাধারণ ওয়েব সার্ভারে আপনার অনেকগুলি সংযোগ খোলা থাকতে পারে এবং হঠাৎ করে সেগুলি বন্ধ করা যুক্তিসঙ্গত নয় কারণ অন্য কেউ দ্বারা ত্রুটি ঘটেছে The অন্যদের তাদের স্বাভাবিক সময় শেষ করার সময় এবং অনুরোধের জন্য একটি ত্রুটি প্রতিক্রিয়া প্রেরণ করুন যা অন্যদেরকে তাদের স্বাভাবিক সময় শেষ করে দেয় এবং সেই কর্মীর মধ্যে নতুন অনুরোধ শুনতে শোনায় "


সংখ্যা 4: মিডলওয়্যারের মধ্যে নয় তবে কেন্দ্রীয়ভাবে ত্রুটিগুলি পরিচালনা করুন

টিএল; ডিআর: অ্যাডমিনকে মেল এবং লগিংয়ের মতো লজিক হ্যান্ডল করার সময় ত্রুটি এলে সমস্ত শেষ পয়েন্ট (যেমন এক্সপ্রেস মিডলওয়্যার, ক্রোন জবস, ইউনিট-টেস্টিং) কলটি একটি ডেডিকেটেড এবং সেন্ট্রালাইজড অবজেক্টে আবশ্যক।

অন্যথায়: একক স্থানে ত্রুটিগুলি পরিচালনা না করা কোড ডুপ্লিকেশন এবং সম্ভবত ত্রুটিগুলি যা ভুলভাবে পরিচালিত হয় তার দিকে পরিচালিত করবে

কোড উদাহরণ - একটি সাধারণ ত্রুটি প্রবাহ

//DAL layer, we don't handle errors here
DB.addDocument(newCustomer, (error, result) => {
    if (error)
        throw new Error("Great error explanation comes here", other useful parameters)
});

//API route code, we catch both sync and async errors and forward to the middleware
try {
    customerService.addNew(req.body).then(function (result) {
        res.status(200).json(result);
    }).catch((error) => {
        next(error)
    });
}
catch (error) {
    next(error);
}

//Error handling middleware, we delegate the handling to the centrzlied error handler
app.use(function (err, req, res, next) {
    errorHandler.handleError(err).then((isOperationalError) => {
        if (!isOperationalError)
            next(err);
    });
});

ব্লগের উদ্ধৃতি: "কখনও কখনও নিম্ন স্তরগুলি তাদের কলারে ত্রুটি প্রচার করা ব্যতীত দরকারী কিছু করতে পারে না" ("নোড.জেএস এরর হ্যান্ডলিং" কীওয়ার্ডগুলির জন্য 1 নম্বরে জোয়েন্ট ব্লগ থেকে)

"... আপনি স্ট্যাকের বিভিন্ন স্তরে একই ত্রুটিটি পরিচালনা করতে পারেন This এটি তখন ঘটে যখন নীচের স্তরগুলি তাদের আহ্বানকারীকে ত্রুটি প্রচার করা ব্যতীত দরকারী কিছু করতে পারে না, যা ত্রুটিটিকে তার কলকারীকে প্রচার করে, ইত্যাদি Often প্রায়ই, অপারেশনটি পুনরায় চেষ্টা করা, ব্যবহারকারীকে বা অন্য কোনও কিছুর প্রতিবেদন করার জন্য উপযুক্ত প্রতিক্রিয়া কী তা কেবল শীর্ষ স্তরের কলারই জানে But তবে এর অর্থ এই নয় যে আপনার সমস্ত ত্রুটিগুলি একটি একক শীর্ষ-স্তরে রিপোর্ট করার চেষ্টা করা উচিত কলব্যাক, কারণ সেই কলব্যাক নিজেই জানতে পারে না যে প্রসঙ্গে ত্রুটিটি ঘটেছিল "


সংখ্যা 5: সোয়াগার ব্যবহার করে দস্তাবেজ এপিআই ত্রুটি

টিএল; ডিআর: আপনার এপিআই কলকারীদের জানিয়ে দিন যে কোন ত্রুটিগুলি এর পরিবর্তে আসতে পারে যাতে তারা ক্রাশ না করে এগুলি চিন্তাভাবনা করে পরিচালনা করতে পারে। এটি সাধারণত সোয়াগারের মতোই আরএসটি এপিআই ডকুমেন্টেশন ফ্রেমওয়ার্কগুলির সাহায্যে করা হয়

অন্যথায়: একটি API ক্লায়েন্ট কেবল ক্রাশ এবং পুনরায় চালু করার সিদ্ধান্ত নিতে পারে কারণ সে বুঝতে পারে না এমন একটি ত্রুটি ফিরে পেয়েছিল। দ্রষ্টব্য: আপনার এপিআই এর কলার আপনি হতে পারেন (একটি মাইক্রোসার্চেস পরিবেশে খুব সাধারণ)

ব্লগের উক্তি: "আপনার কলকারীদের বলতে হবে যে ত্রুটিগুলি কী ঘটতে পারে" (ব্লগ জয়েয়েন্ট থেকে, "নোড.জেএস লগিং" কীওয়ার্ডগুলির জন্য 1 স্থান রয়েছে)

… আমরা কীভাবে ত্রুটিগুলি পরিচালনা করব সে সম্পর্কে কথা বলেছি, কিন্তু আপনি যখন একটি নতুন ফাংশন লিখছেন, তখন আপনি কীভাবে কোডটিতে ত্রুটি বিতরণ করবেন যা আপনার ফাংশন বলে? … আপনি যদি না জানেন কোন ত্রুটিগুলি ঘটতে পারে বা সেটির অর্থ কী তা জানেন না, তবে আপনার প্রোগ্রামটি দুর্ঘটনা ছাড়া সঠিক হতে পারে না। সুতরাং আপনি যদি একটি নতুন ফাংশন লিখছেন তবে আপনার কলকারীদের বলতে হবে কী ত্রুটি ঘটতে পারে এবং তারা কী করে me


সংখ্যা 6: কোনও অপরিচিত শহরে এলে মনোযোগ দিয়ে প্রক্রিয়াটি বন্ধ করুন

টিএল; ডিআর: যখন কোনও অজানা ত্রুটি ঘটে (একজন বিকাশকারী ত্রুটি, সেরা অনুশীলন নম্বর # 3 দেখুন) - অ্যাপ্লিকেশনটির স্বাস্থ্যকরতা সম্পর্কে অনিশ্চয়তা রয়েছে। একটি সাধারণ অনুশীলনটি ফরওয়ার এবং পিএম 2 এর মতো 'পুনরায় চালুকরণ' সরঞ্জাম ব্যবহার করে সাবধানতার সাথে প্রক্রিয়াটি পুনরায় চালু করার পরামর্শ দেয়

অন্যথায়: যখন অপরিচিত ব্যতিক্রম ধরা পড়ে তখন কিছু বস্তু ত্রুটিযুক্ত অবস্থানে থাকতে পারে (যেমন একটি ইভেন্ট ইমিটার যা বিশ্বজুড়ে ব্যবহৃত হয় এবং কিছু অভ্যন্তরীণ ব্যর্থতার কারণে ইভেন্টগুলিতে গুলি চালানো হয় না) এবং ভবিষ্যতের সমস্ত অনুরোধগুলি ব্যর্থ বা ক্রেজি আচরণ করতে পারে

কোড উদাহরণ - ক্রাশ হবে কিনা তা স্থির করে

//deciding whether to crash when an uncaught exception arrives
//Assuming developers mark known operational errors with error.isOperational=true, read best practice #3
process.on('uncaughtException', function(error) {
 errorManagement.handler.handleError(error);
 if(!errorManagement.handler.isTrustedError(error))
 process.exit(1)
});


//centralized error handler encapsulates error-handling related logic 
function errorHandler(){
 this.handleError = function (error) {
 return logger.logError(err).then(sendMailToAdminIfCritical).then(saveInOpsQueueIfCritical).then(determineIfOperationalError);
 }

 this.isTrustedError = function(error)
 {
 return error.isOperational;
 }

ব্লগের উদ্ধৃতি: "ত্রুটি পরিচালনার বিষয়ে তিনটি চিন্তাভাবনা রয়েছে" (ব্লগ জ্রেসিপেস থেকে)

… ত্রুটি পরিচালনার জন্য প্রাথমিকভাবে তিনটি চিন্তাভাবনা রয়েছে: ১. অ্যাপ্লিকেশনটি ক্রাশ হতে দিন এবং এটি পুনরায় চালু করতে দিন। ২. সমস্ত সম্ভাব্য ত্রুটিগুলি পরিচালনা করুন এবং কখনই ক্রাশ হবে না। ৩. দুজনের মধ্যে ভারসাম্যযুক্ত পন্থা


সংখ্যা 7: ত্রুটির দৃশ্যমানতা বাড়াতে একটি পরিপক্ক লগার ব্যবহার করুন

টিএল; ডিআর: উইনস্টন, বুনিয়ান বা লগ ৪ জে এর মতো পরিপক্ক লগিং সরঞ্জামগুলির একটি সেট ত্রুটি আবিষ্কার এবং বোঝার গতি বাড়িয়ে তুলবে। সুতরাং কনসোল.লগ সম্পর্কে ভুলবেন না

অন্যথায়: কনসোল.লগগুলির মাধ্যমে বা ম্যানুয়ালি মেশিন টেক্সট ফাইলের মাধ্যমে অনুসন্ধানের সরঞ্জামগুলি বা কোনও শালীন লগ ভিউয়ারের সাহায্যে আপনাকে দেরি না হওয়া পর্যন্ত কাজের মধ্যে ব্যস্ত রাখতে পারে

কোড উদাহরণ - ক্রিয়ায় উইনস্টন লগার

//your centralized logger object
var logger = new winston.Logger({
 level: 'info',
 transports: [
 new (winston.transports.Console)(),
 new (winston.transports.File)({ filename: 'somefile.log' })
 ]
 });

//custom code somewhere using the logger
logger.log('info', 'Test Log Message with some parameter %s', 'some parameter', { anything: 'This is metadata' });

ব্লগের উদ্ধৃতি: "কয়েকটি প্রয়োজনীয়তা সনাক্ত করতে দিন (লগারের জন্য):" (ব্লগ স্ট্রংব্লগ থেকে)

… কয়েকটি প্রয়োজনীয়তা সনাক্ত করতে দিন (লগারের জন্য): 1. প্রতিটি লগ লাইনের সময় স্ট্যাম্প করুন। এটি একটি স্ব স্ব বিবৃতিমূলক - প্রতিটি লগ এন্ট্রি কখন হয়েছিল তা আপনার জানা উচিত। ২. লগিং ফর্ম্যাটটি মানুষের পাশাপাশি মেশিনগুলির দ্বারা সহজে হজমযোগ্য হওয়া উচিত। ৩. একাধিক কনফিগারযোগ্য গন্তব্য প্রবাহের জন্য অনুমতি দেয়। উদাহরণস্বরূপ, আপনি কোনও ফাইলে ট্রেস লগ লিখতে পারেন তবে কোনও ত্রুটি দেখা দিলে একই ফাইলটিতে লিখুন, তারপরে ত্রুটি ফাইলে লিখুন এবং একই সাথে একটি ইমেল প্রেরণ করুন…


সংখ্যা 8: এপিএম পণ্যগুলি ব্যবহার করে ত্রুটি এবং ডাউনটাইম আবিষ্কার করুন

টিএল; ডিআর: মনিটরিং এবং পারফরম্যান্সের পণ্যগুলি (ওরফে এপিএম) আপনার কোডবেস বা এপিআইর সক্রিয়ভাবে গেজ করে যাতে তারা আপনাকে হারিয়ে যাওয়া ত্রুটি, ক্র্যাশ এবং ধীর অংশগুলি স্বয়ংক্রিয়ভাবে হাইলাইট করতে পারে they

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

ব্লগের উদ্ধৃতি: "এপিএম পণ্য বিভাগ" (ইয়োনি গোল্ডবার্গ ব্লগ থেকে)

"... এপিএম পণ্যগুলি তিনটি প্রধান বিভাগ গঠন করে: ১. ওয়েবসাইট বা এপিআই মনিটরিং - এইচটিটিপি অনুরোধের মাধ্যমে অব্যাহতভাবে আপটাইম এবং কর্মক্ষমতা নিরীক্ষণ করে এমন বাহ্যিক পরিষেবাগুলি few কয়েক মিনিটের মধ্যে সেটআপ করা যেতে পারে Following নীচে কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: পিংডম, আপটাইম রোবট এবং নিউ রেলিক ২ কোড ইন্সট্রুমেন্টেশন - পণ্য পরিবারে ধীরে কোড সনাক্তকরণ, ব্যতিক্রম পরিসংখ্যান, কর্মক্ষমতা নিরীক্ষণ এবং আরও অনেক কিছু উপকারের জন্য আবেদনের মধ্যে কোনও এজেন্ট এম্বেড করা দরকার Following নীচে কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: নতুন রেলিক, অ্যাপ ডায়নামিক্স ৩. অপারেশনাল ইন্টেলিজেন্স ড্যাশবোর্ড -এই পণ্যগুলির লাইনটি ম্যাট্রিক্স এবং কিউরেটেড কন্টেন্টের সাহায্যে অপস দলকে সুবিধার্থে ফোকাস করে যা সহজেই অ্যাপ্লিকেশন কর্মক্ষমতা শীর্ষে থাকতে সহায়তা করে। এটি সাধারণত একাধিক তথ্যের উত্স (অ্যাপ্লিকেশন লগস, ডিবি লগস, সার্ভার লগ, ইত্যাদি) এবং ডানবোর্ড নকশার কাজকে সামনে রেখে জড়িত। নিম্নলিখিত কয়েকটি নির্বাচিত প্রতিযোগী রয়েছে: ডেটাডোগ, স্প্লঙ্ক "


উপরেরটি একটি সংক্ষিপ্ত সংস্করণ - এখানে আরও সেরা অনুশীলন এবং উদাহরণ দেখুন


30

আপনি অপ্রকাশিত ব্যতিক্রমগুলি ধরতে পারেন তবে এটি সীমিত ব্যবহারের নয়। Http://debuggable.com/posts/node-js-dealing-with-uncaught-exferences:4c933d54-1428-443c-928d-4e1ecbdd56cb দেখুন

monit, foreverবা upstartনোড প্রক্রিয়াটি ক্র্যাশ হয়ে গেলে পুনরায় চালু করতে ব্যবহৃত হতে পারে। একটি চমত্কার শাটডাউন সর্বোত্তম যার জন্য আপনি আশা করতে পারেন (উদাহরণস্বরূপ সমস্ত অপ্রয়োজনীয় হ্যান্ডলারের মধ্যে মেমরির ডেটা সংরক্ষণ করুন)।


4
+1 লিঙ্কটি দরকারী, ধন্যবাদ। আমি এখনও সেরা অনুশীলন এবং নোড.জেএস এর প্রসঙ্গে "গ্রেফুল রিস্টার্ট" এর অর্থ খুঁজছি
মোমো

এই প্রসঙ্গে "গ্রেফুল রিস্টার্ট" সম্পর্কে আমার বোধগম্যতা মূলত এনপোনসকপের পরামর্শ অনুসারে হবে: প্রক্রিয়াটি মরুক, এবং যা কিছু চলছে তা প্রথম স্থানে এটি পুনরায় চালু করতে দিন।
ইলক্কা

এই লিঙ্কের জন্য অনেক ধন্যবাদ! সত্যিই দরকারী!
সতীশজেএম

এটি একটি দুর্দান্ত উত্তর। আমি তবে আপনার প্রথম উদাহরণটিতে ত্রুটি ফিরিয়ে দেওয়ার বিষয়ে একমত নই। কোনও ফেরত দেওয়া Errorরিটার্ন মানকে বহুমুখী করে তোলে যা অকারণে ফাংশনটির শব্দার্থকে জটিল করে তোলে। তদ্ব্যতীত, 0 দ্বারা ডাইভিং ইতিমধ্যে দিয়ে জাভাস্ক্রিপ্ট মধ্যে নাড়াচাড়া Infinity, -Infinityঅথবা NaN, মান যেখানে typeof === 'number'। তাদের সাথে চেক করা যেতে পারে !isFinite(value)। সাধারণভাবে আমি কোনও ফাংশন থেকে কখনও ত্রুটি না ফেরানোর পরামর্শ দেব। একটি বিশেষ নন-পলিমারফিক মান ডাব্লু / সামঞ্জস্যপূর্ণ শব্দার্থক নিক্ষেপ বা ফেরত দেওয়ার জন্য কোডের যোগ্যতা এবং রক্ষণাবেক্ষণের ক্ষেত্রে আরও ভাল।
wprl

লিঙ্কটি নষ্ট হয়ে গেছে। ডাউনফরোয়ারিয়োনোরজেডমেড
কেভ

13

নোডেজ ডোমেনগুলি নোডেজগুলিতে ত্রুটিগুলি পরিচালনা করার সর্বাধিক আপ টু ডেট। ডোমেনগুলি ত্রুটি / অন্যান্য ইভেন্ট পাশাপাশি traditionতিহ্যগতভাবে নিক্ষিপ্ত বস্তু উভয়ই ক্যাপচার করতে পারে। ডোমেনগুলি ইন্টারসেপ্ট পদ্ধতির মাধ্যমে প্রথম যুক্তি হিসাবে পাস করা একটি ত্রুটিযুক্ত কলব্যাকগুলি পরিচালনা করার জন্য কার্যকারিতা সরবরাহ করে।

সাধারণ চেষ্টা / ধরা-শৈলীর ত্রুটি হ্যান্ডলিংয়ের মতো, ত্রুটিগুলি ঘটে গেলে সাধারণত নিক্ষেপ করা সবচেয়ে ভাল এবং আপনি যে জায়গাগুলিতে বাকি কোডগুলি প্রভাবিত করতে ত্রুটিগুলি বিচ্ছিন্ন করতে চান সেগুলি ব্লক করে দেওয়া। এই অঞ্চলগুলিকে "ব্লক আউট" করার উপায় হল ডোমেন.আরুনকে বিচ্ছিন্ন কোডের একটি ব্লক হিসাবে একটি ফাংশন সহ কল ​​করা।

সিঙ্ক্রোনাস কোডে, উপরেরটি যথেষ্ট - যখন কোনও ত্রুটি ঘটে তখন আপনি এটিকে নিক্ষেপ করতে দেন, বা আপনি এটি ধরেন এবং সেখানে পরিচালনা করতে পারেন, যে কোনও ডেটা রিভার্ট করার দরকার হবে তা ফিরিয়ে আনতে হবে।

try {  
  //something
} catch(e) {
  // handle data reversion
  // probably log too
}

একটি তাত্পর্যপূর্ণ কলব্যাকে ত্রুটিটি ঘটে গেলে, আপনাকে হয় পুরোপুরি ডেটা রোলব্যাক পরিচালনা করতে সক্ষম হতে হবে (ভাগ করা রাষ্ট্র, ডাটাবেসগুলির মতো বাহ্যিক ডেটা ইত্যাদি)। বা আপনাকে কিছু সেট করতে হবে যা ইঙ্গিত করতে পারে যে একটি ব্যতিক্রম ঘটেছে - যেখানে আপনি কখনই এই পতাকাটির প্রতি যত্নশীল হন, আপনাকে কলব্যাক সম্পূর্ণ হওয়ার জন্য অপেক্ষা করতে হবে।

var err = null;
var d = require('domain').create();
d.on('error', function(e) {
  err = e;
  // any additional error handling
}
d.run(function() { Fiber(function() {
  // do stuff
  var future = somethingAsynchronous();
  // more stuff

  future.wait(); // here we care about the error
  if(err != null) {
    // handle data reversion
    // probably log too
  }

})});

উপরের কোডগুলির কয়েকটি কুৎসিত, তবে আপনি নিজের সুন্দর করার জন্য এটি নিদর্শন তৈরি করতে পারেন, যেমন:

var specialDomain = specialDomain(function() {
  // do stuff
  var future = somethingAsynchronous();
  // more stuff

  future.wait(); // here we care about the error
  if(specialDomain.error()) {
    // handle data reversion
    // probably log too
  } 
}, function() { // "catch"
  // any additional error handling
});

আপডেট (2013-09):

উপরে, আমি এমন একটি ভবিষ্যত ব্যবহার করি যা সংশ্লেষিত তন্তুগুলি বোঝায় , যা আপনাকে ফিউচারগুলিকে অনলাইনে অপেক্ষা করতে দেয়। এটি আসলে আপনাকে প্রতিটি কিছুর জন্য ট্র্যাডিশনাল ট্র্যাচ-ব্লক ব্যবহার করতে দেয় - যা আমি যেতে সবচেয়ে ভাল উপায় বলে মনে করি। তবে আপনি সর্বদা এটি করতে পারবেন না (যেমন ব্রাউজারে) ...

এমন ফিউচারগুলিও রয়েছে যেগুলি ফাইবারের শব্দার্থবিজ্ঞানের প্রয়োজন হয় না (যা পরে সাধারণ, ব্রাউজারে জাভাস্ক্রিপ্ট নিয়ে কাজ করে)। এগুলিকে ফিউচার, প্রতিশ্রুতি বা মুলতুবি বলা যেতে পারে (আমি এখানে থেকে ফিউচারগুলিকে কেবল উল্লেখ করব)। সাধারণ-পুরাতন-জাভাস্ক্রিপ্ট ফিউচার লাইব্রেরিগুলি ফিউচারগুলির মধ্যে ত্রুটিগুলি প্রচারের অনুমতি দেয়। এই গ্রন্থাগারগুলির মধ্যে কেবল কয়েকটি নিক্ষিপ্ত ভবিষ্যতকে সঠিকভাবে পরিচালিত করার অনুমতি দেয়, তাই সাবধান হন।

একটি উদাহরণ:

returnsAFuture().then(function() {
  console.log('1')
  return doSomething() // also returns a future

}).then(function() {
  console.log('2')
  throw Error("oops an error was thrown")

}).then(function() {
  console.log('3')

}).catch(function(exception) {
  console.log('handler')
  // handle the exception
}).done()

টুকরাগুলি অবিচ্ছিন্ন হলেও এটি সাধারণ চেষ্টা-অনুকরণকে নকল করে। এটি মুদ্রিত হবে:

1
2
handler

মনে রাখবেন যে এটি '3' মুদ্রণ করে না কারণ একটি ব্যতিক্রম ছুঁড়েছিল যা প্রবাহকে বাধা দেয়।

ব্লুবার্ড প্রতিশ্রুতি একবার দেখুন:

মনে রাখবেন যে আমি এগুলি ব্যতীত অন্য অনেক লাইব্রেরি পাইনি যা নিক্ষিপ্ত ব্যতিক্রমগুলি সঠিকভাবে পরিচালনা করে। jQuery এর বিলম্বিত, উদাহরণস্বরূপ, করবেন না - "ব্যর্থ" হ্যান্ডলার কখনই ব্যতিক্রমটিকে 'তারপরে' হ্যান্ডলার নিক্ষেপ করবে না, যা আমার মতে একটি চুক্তি ভঙ্গকারী।


জাভাস্ক্রিপ্টে যথাযথ প্রতিশ্রুতির বিবরণ প্রতিশ্রুতি / এ + হিসাবে পরিচিত। আপনি এখানে বাস্তবায়নের একটি তালিকা দেখতে পাবেন: github.com/promises-aplus/promises-spec/blob/master/… । মনে রাখবেন যে খালি প্রতিশ্রুতি / এ + অনুশীলনে অ ব্যবহার্য - প্রতিশ্রুতিগুলি / এ + এখনও গ্রন্থাগারগুলিকে তাদের সমাধান করার জন্য প্রচুর ব্যবহারিক সমস্যা ফেলে। তবে আপনার প্রদর্শিত ত্রুটি প্রচারের মতো একেবারে প্রয়োজনীয় জিনিসগুলি, ডিট্রিমেন্টিক এক্সিকিউশন অর্ডার এবং স্ট্যাক ওভারফ্লো থেকে সুরক্ষার নিশ্চয়তা রয়েছে।
ইসাইলিজা


11

আমি সম্প্রতি এ সম্পর্কে লিখেছিলাম http://snmaynard.com/2012/12/21/node-error-handling/ এ । ০.৮ সংস্করণে নোডের একটি নতুন বৈশিষ্ট্য হ'ল ডোমেনগুলি এবং আপনাকে ত্রুটি হ্যান্ডলিংয়ের সমস্ত ফর্মকে এক সহজ পরিচালনা ফর্মের সাথে একত্রিত করার অনুমতি দেয়। আপনি তাদের সম্পর্কে আমার পোস্টে পড়তে পারেন।

আপনি আপনার অনাবৃত ব্যতিক্রমগুলি ট্র্যাক করার জন্য বাগসনাগের মতো কিছু ব্যবহার করতে পারেন এবং ইমেল, চ্যাটরুমের মাধ্যমে অবহিত হতে পারেন বা অবিচ্ছিন্ন ব্যতিক্রমের জন্য টিকিট তৈরি করেছেন (আমি বাগসনাগের সহ-প্রতিষ্ঠাতা)।


2
ডোমেন মডিউলটি এখন আনুষ্ঠানিকভাবে হ্রাস পেয়েছে। nodejs.org/api/domain.html
ম্যাটসিডর

3

আমি এটি যোগ করতে চাই স্টেপ.জেস লাইব্রেরি আপনাকে সর্বদা পরবর্তী পদক্ষেপের কার্যক্রমে এটি ব্যতিক্রম করে ব্যতিক্রমগুলি পরিচালনা করতে সহায়তা করে। অতএব আপনার শেষ পদক্ষেপ হিসাবে একটি ফাংশন থাকতে পারে যা পূর্ববর্তী কোনও পদক্ষেপের কোনও ত্রুটি পরীক্ষা করে। এই পদ্ধতির আপনার ত্রুটি পরিচালনা পরিচালনা ব্যাপকভাবে সহজ করতে পারে।

নীচে গিথুব পৃষ্ঠা থেকে একটি উদ্ধৃতি দেওয়া হয়েছে:

নিক্ষিপ্ত কোনও ব্যতিক্রম ধরা পড়ে এবং পরবর্তী কার্যক্রমে প্রথম যুক্তি হিসাবে পাস হয়। যতক্ষণ আপনি কলব্যাক ফাংশনগুলিকে আপনার মূল ফাংশনগুলিতে ইনলাইন না করেন ততক্ষণ এটি কোনও অনাবৃত ব্যতিক্রম হওয়া থেকে বাধা দেয়। দীর্ঘ চলমান নোডের জন্য এটি খুব গুরুত্বপূর্ণ J জেএস সার্ভারগুলি যেহেতু একক অবিকৃত ব্যতিক্রম পুরো সার্ভারকে নামিয়ে আনতে পারে।

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


3

একটি উদাহরণ যেখানে ট্রাই-ক্যাচ ব্যবহার করা উপযুক্ত হতে পারে তা হ'ল ফোর ইচ লুপ ব্যবহার করার সময়। এটি সিঙ্ক্রোনাস তবে একই সময়ে আপনি কেবল অভ্যন্তরীণ ক্ষেত্রের মধ্যে কোনও রিটার্ন বিবৃতি ব্যবহার করতে পারবেন না। পরিবর্তে একটি চেষ্টা এবং ধরা পদ্ধতির উপযুক্ত সুযোগে ত্রুটি অবজেক্ট ফিরে আসতে ব্যবহার করা যেতে পারে। বিবেচনা:

function processArray() {
    try { 
       [1, 2, 3].forEach(function() { throw new Error('exception'); }); 
    } catch (e) { 
       return e; 
    }
}

এটি উপরে @ বালুপটন দ্বারা বর্ণিত পদ্ধতির সংমিশ্রণ।


ত্রুটি নিক্ষেপ করার পরিবর্তে, কিছু বিকাশকারী রাস্টের ফলাফল ধারণাটি কোনও ঠিক আছে বা একটি ব্যর্থ হয় , যদি ব্যর্থতা একটি চেনা সম্ভাবনা থাকে তখন ফিরে আসার পরামর্শ দেয়। এটি ব্যর্থতাগুলি অপ্রত্যাশিত ত্রুটি থেকে আলাদা রাখে। এর একটি জেএস বাস্তবায়ন আর ফলাফল
জোয়েটউইল

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

1

কিছুক্ষণ আগে এই পোস্টটি পড়ার পরে আমি ভাবছিলাম যে এপিআই / ফাংশন স্তরে ব্যতিক্রম হ্যান্ডলিংয়ের জন্য ডোমেনগুলি ব্যবহার করা নিরাপদ কিনা। আমি লিখেছি প্রতিটি async ফাংশনে ব্যতিক্রম হ্যান্ডলিং কোডটি সহজ করতে তাদের ব্যবহার করতে চেয়েছিলাম। আমার উদ্বেগটি ছিল যে প্রতিটি ফাংশনের জন্য একটি নতুন ডোমেন ব্যবহার করা গুরুত্বপূর্ণ ওভারহেডের পরিচয় দেবে। আমার বাড়ির কাজটি ইঙ্গিত দেয় যে সেখানে নিম্নতম ওভারহেড রয়েছে এবং কিছু পরিস্থিতিতে চেষ্টা করার চেয়ে ডোমেনগুলির চেয়ে কার্য সম্পাদন কার্যত আরও ভাল better

http://www.lighthouselogic.com/#/using-a-new-domain-for-each-async-function-in-node/


1

ত্রুটিগুলি ধরার বিষয়টি এখানে খুব ভালভাবে আলোচিত হয়েছে তবে ত্রুটিগুলি অন্য কোথাও লগ আউট করা মনে রাখা উচিত যাতে আপনি সেগুলি দেখতে এবং স্টাফ আপ ঠিক করতে পারেন।

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

var log = bunyan.createLogger({
  name: 'myapp',
  streams: [
    {
      level: 'error',
      path: '/var/tmp/myapp-error.log'  // log ERROR to this file
    }
  ]
});

আপনার যদি প্রচুর ত্রুটি এবং / অথবা সার্ভারগুলি পরীক্ষা করতে থাকে তবে এটি সময় সাশ্রয়ী হতে পারে, সুতরাং রায়গুন (অস্বীকারকারী, আমি রায়গুনে কাজ করি) এর সাথে গ্রুপ ত্রুটিগুলিকে একসাথে দেখতে বা এটি উভয়কে একসাথে ব্যবহার করা উপযুক্ত। যদি আপনি রায়গুনকে একটি সরঞ্জাম হিসাবে ব্যবহার করার সিদ্ধান্ত নিয়ে থাকেন তবে এটি সেটআপ করাও বেশ সহজ

var raygunClient = new raygun.Client().init({ apiKey: 'your API key' });
raygunClient.send(theError);

পিএম 2 বা চিরতরের মতো সরঞ্জাম ব্যবহার করে ক্রস করা হয়েছে, আপনার অ্যাপ্লিকেশনটি ক্র্যাশ করতে, কী ঘটেছে তা লগ আউট করতে এবং কোনও বড় সমস্যা ছাড়াই পুনরায় বুট করতে সক্ষম হওয়া উচিত।


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