`নিক্ষেপ নতুন ত্রুটি` এবং some কিছু ওবজেক্ট` এর মধ্যে পার্থক্য কী?


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
নতুন নতুন ত্রুটি ({prop: val}) নিয়ে সমস্যাটি এটি ত্রুটির বৈধ নির্মাণ নয়। ত্রুটি হেমন্তের আলোচিত বৈশিষ্ট্য হিসাবে পরিচিত।
গ্র্যান্টপর্াক্স

উত্তর:


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
এমনকি প্রশ্নের উত্তর কি এখনও সবচেয়ে উর্ধ্বে দেওয়া হয়নি?
ব্যবহারকারী 9993

@ ব্যবহারকারী 9993 ব্যবহারকারী হো জিজ্ঞাসা করা প্রশ্নটি সেই সময়ে চ্যাট অনুযায়ী বিস্তারিত বোঝার জন্য সন্ধান করছিল, সুতরাং সেই অনুযায়ী উত্তর সরবরাহ করা হয়েছে এবং ব্যবহারকারীর পক্ষে দরকারী। এটিই গ্রহণযোগ্য এবং সর্বাধিক ভোটের কারণ।
হেমন্ত মেটালিয়া

5
@ হেমন্তমেতালিয়া তবে তিনি ঠিক বলেছেন, উত্তর ওপিএস প্রশ্নের উত্তর দেওয়ার সামান্যতম প্রচেষ্টা এমনকি দেখায়নি। আড্ডায় কিছু খুব আলাদা উত্তর যদি উত্তর দেওয়া হয় যা চ্যাটে থাকা উচিত, তবে এখানে প্রশ্নোত্তর কোনও যৌক্তিক সংযোগ নেই।
মারে

এবং মূল প্রশ্নের উত্তর দিতে, এটি জাভাস্ক্রিপ্টের সাথে কোনও ব্যাপার নয়। যাইহোক, Error(এবং উপশ্রেণী) কনভেনশন দ্বারা ব্যবহৃত হয়। এগুলি ডিফল্টরূপে একটি স্ট্যাক সম্পত্তি সরবরাহ করে, যদিও এটি ম্যানুয়ালি অন্য কোনওটিতে যুক্ত করা যেতে পারে। সুতরাং এটি সত্যিই বেশিরভাগ কনভেনশন, প্রোগ্রাম ফ্লো আপনি যা ছুঁড়ে তা দ্বারা প্রভাবিত হয় না, আপনি যে কোনও throwবিষয়েই। আপনি throw "grandmother down the stairs";এটি করতে পারেন এবং এটি একই কাজ করবে, ব্যতীত কোনও সংযুক্ত স্ট্যাক ট্রেস এবং ত্রুটি হ্যান্ডলিং ফাংশন, সাংবাদিক, ডিবাগারগুলি প্রত্যাশিত Errorবৈশিষ্ট্য বা যে বৈশিষ্ট্যগুলির সাথে আসে তা আরও সুনির্দিষ্ট হতে পারে না except
মারে

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
ত্রুটি কার্যকরী, নতুন ত্রুটি একটি নির্মাণকারী। উভয় একই ভাবে কাজ করে developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Nishchit Dhanani

5
@ নিশীতধনানি আমার কাছে অবাক লাগছে যে এইরকম অনিবার্য ও ভুল মন্তব্য উত্সাহ পেয়েছে। উভয়ই "ত্রুটি কার্যকরী", বা "নতুন ত্রুটি একটি নির্মাতা" এগুলি কোনওভাবেই বোঝায় না এবং / বা ভুল। সেই প্রসঙ্গে এই লিঙ্কটি "প্রমাণ" করার জন্য ঠিক কী ধারণা করা হচ্ছে তা অস্পষ্ট। এটির জন্য MDN পৃষ্ঠা Error, ঠিক আছে মন্তব্যের সাথে সংযোগটি কোথায়? ওপিএস প্রশ্নের মন্তব্যে এবং জবাব দেওয়া অর্ধেক লোকের সবে চুপ থাকা উচিত ছিল।
মারে

@ মারে Used as a functionএই লিঙ্কটি থেকে এই বিভাগটি দেখুন ... বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

ঠিক আছে আমি বুঝতে পেরেছি. এটি একটি ফাংশন
নিশ্চীত ধনানী

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())টি আরও নির্ভরযোগ্য, যেহেতু ইন্টারনেট এক্সপ্লোরার এবং সাফারি (সংস্করণ সম্পর্কে অনিশ্চিত) ব্রাউজারগুলি পূর্ববর্তীটি ব্যবহার করার সময় বার্তাটি সঠিকভাবে রিপোর্ট করে না।

এটি করার ফলে একটি ত্রুটি ছুঁড়ে ফেলা হবে, তবে সমস্ত ব্রাউজার আপনার প্রত্যাশা মতো সাড়া দেয় না। ফায়ারফক্স, অপেরা এবং ক্রোম প্রত্যেকে একটি "অবিরত ব্যতিক্রম" বার্তা প্রদর্শন করে এবং তারপরে বার্তাটির স্ট্রিং অন্তর্ভুক্ত করে। সাফারি এবং ইন্টারনেট এক্সপ্লোরার কেবল একটি "ব্যতীত ব্যতিক্রম" ত্রুটি ছুঁড়ে ফেলে ম্যাসেজের স্ট্রিংটি মোটেও সরবরাহ করে না। স্পষ্টতই, এটি একটি ডিবাগিং দৃষ্টিকোণ থেকে suboptimal।


36

আপনি প্রথমে এই কোডটি উল্লেখ করেছেন:

throw new Error('sample')

এবং তারপরে আপনার প্রথম উদাহরণে আপনি লিখুন:

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

প্রথম ত্রুটি বস্তুটি আসলে কাজ করবে, কারণ এটি স্ট্রিং মান প্রত্যাশা করে, এই ক্ষেত্রে 'নমুনা'। দ্বিতীয়টি হ'ল না কারণ আপনি কোনও বস্তুকে পাস করার চেষ্টা করছেন এবং এটি স্ট্রিংয়ের প্রত্যাশা করছে।

ত্রুটিযুক্ত বস্তুর "বার্তা" সম্পত্তি থাকবে যা 'নমুনা' হবে।


12
দ্বিতীয়টি কাজ করে, খুব কার্যকর উপায়ে নয়। এটি toString()পাস হওয়া অবজেক্টটিতে পদ্ধতিটি কার্যকর করে, এর ফলে [object Object]ত্রুটি হয় (যেমন ওপেন লিখেছেন)।
সিজেএন


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'};

ক্রোম ডেভোলগুলিতে এইরকম দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

ক্রোম আমাদের জানায় যে আমাদের একটি অনাবৃত ত্রুটি রয়েছে যা কেবল একটি জেএস অবজেক্ট। অবজেক্টটিতে নিজেই ত্রুটি সম্পর্কিত তথ্য থাকতে পারে তবে আমরা তা তাত্ক্ষণিকভাবে জানি না যে এটি কোথা থেকে এসেছে। যখন আমরা আমাদের কোডটিতে কাজ করি এবং এটি ডিবাগ করি তখন খুব কার্যকর হয় না।


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

ক্রোম ডেভোলগুলিতে এইরকম দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

ত্রুটিযুক্ত বস্তুর সাথে নিক্ষিপ্ত একটি ত্রুটি যখন আমরা এটি প্রসারিত করি তখন আমাদের স্ট্যাক ট্রেস দেয়। এটি আমাদের মূল্যবান তথ্য দেয় যেখানে ত্রুটিটি স্পষ্টভাবে এসেছিল যা আপনার কোডটি ডিবাগ করার সময় প্রায়শই মূল্যবান তথ্য is ত্রুটিটি বলেছে যে আরও নোট করুন [object Object], এটি কারণ কারণ Errorনির্মাণকারী একটি বার্তা স্ট্রিংটিকে প্রথম আর্গুমেন্ট হিসাবে আশা করে। যখন এটি কোনও বস্তু পায় এটি এটিকে স্ট্রিংয়ে বাধ্য করে।


2

প্রতিক্রিয়া আচরণ

বাকি উত্তরগুলি বাদে আমি প্রতিক্রিয়াটির মধ্যে একটি পার্থক্য দেখাতে চাই।

আমি যদি একটি ফেলে দিই new Error()এবং আমি বিকাশ মোডে থাকি তবে আমি একটি ত্রুটি স্ক্রিন এবং একটি কনসোল লগ পাব। যদি আমি একটি স্ট্রিং আক্ষরিক নিক্ষেপ করি তবে আমি এটি কেবল কনসোলে দেখতে পাব এবং সম্ভবত আমি এটি মিস করব, যদি আমি কনসোল লগটি না দেখছি।

উদাহরণ

কনসোল মধ্যে একটি ত্রুটি লগ নিক্ষেপ এবং উন্নয়ন মোডে সময় একটি ত্রুটি পর্দা শো (পর্দা উৎপাদনে দৃশ্যমান হবে না)।

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

প্রতিক্রিয়া মধ্যে ত্রুটি পর্দা

যেখানে নিম্নলিখিত কোডগুলি কেবল কনসোলে লগইন করে:

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