ত্রুটি
এর ত্রুটি সম্পর্কে কথা বলা যাক।
দুটি ধরণের ত্রুটি রয়েছে:
- প্রত্যাশিত ত্রুটি
- অপ্রত্যাশিত ত্রুটি
- একের পর এক ত্রুটি
প্রত্যাশিত ত্রুটি
প্রত্যাশিত ত্রুটিগুলি এমন রাষ্ট্রগুলিতে হয় যেখানে ভুল জিনিসটি ঘটে তবে আপনি জানেন যে এটি হতে পারে, তাই আপনি এটি মোকাবেলা করেন।
এগুলি ব্যবহারকারীর ইনপুট বা সার্ভারের অনুরোধগুলির মতো জিনিস। আপনি জানেন যে ব্যবহারকারীর কোনও ভুল হতে পারে বা সার্ভারটি ডাউন হয়ে যেতে পারে, তাই আপনি প্রোগ্রামটি আবার ইনপুট চেয়েছে কিনা তা নিশ্চিত করার জন্য আপনি কিছু চেকিং কোড লিখেছেন বা কোনও বার্তা প্রদর্শন করেন বা অন্য যে কোনও আচরণ যথাযথ is
এগুলি হ্যান্ডেল করার পরে পুনরুদ্ধারযোগ্য। যদি হাতছাড়া হয়ে যায় তবে এগুলি অপ্রত্যাশিত ত্রুটি হয়ে যায়।
অপ্রত্যাশিত ত্রুটি
অপ্রত্যাশিত ত্রুটিগুলি (বাগগুলি) এমন রাষ্ট্রগুলিকে বলা হয় যেখানে কোডটি ভুল হওয়ার কারণে ভুল জিনিস ঘটে। আপনি জানেন যে এগুলি শেষ পর্যন্ত ঘটবে, তবে তাদের সাথে কোথায় বা কীভাবে আচরণ করা যায় তা জানার উপায় নেই কারণ সংজ্ঞা অনুসারে তারা অপ্রত্যাশিত।
এগুলি সিনট্যাক্স এবং লজিক ত্রুটির মতো জিনিস। আপনার কোডটিতে একটি টাইপও থাকতে পারে, আপনি ভুল পরামিতিগুলির সাহায্যে কোনও ফাংশন ডাকতে পারেন। এগুলি সাধারণত পুনরুদ্ধারযোগ্য নয়।
try..catch
এর সম্পর্কে কথা বলা যাক try..catch
।
জাভাস্ক্রিপ্টে, throw
সাধারণত ব্যবহৃত হয় না। কোডের উদাহরণগুলির জন্য যদি আপনি ঘুরে দেখেন তবে সেগুলি খুব কম এবং খুব দূরত্বের হতে চলেছে এবং সাধারণত এর লাইনের সাথে কাঠামোযুক্ত হয়
function example(param) {
if (!Array.isArray(param) {
throw new TypeError('"param" should be an array!');
}
...
}
এ কারণে, try..catch
নিয়ন্ত্রণ প্রবাহের জন্য ব্লকগুলি সমস্ত সাধারণ নয়। প্রত্যাশিত ত্রুটিগুলি এড়ানোর জন্য পদ্ধতিগুলি কল করার আগে কিছু চেক যুক্ত করা সাধারণত বেশ সহজ।
জাভাস্ক্রিপ্টের পরিবেশগুলিও বেশ ক্ষমাশীল, তাই অপ্রত্যাশিত ত্রুটিগুলি প্রায়শই ভালভাবে ফেলে রাখা হয়।
try..catch
অস্বাভাবিক হতে হবে না। কিছু দুর্দান্ত ব্যবহারের কেস রয়েছে যা জাভা এবং সি # এর মতো ভাষাতে বেশি দেখা যায়। জাভা এবং সি # তে টাইপড catch
কন্সট্রাক্টসের সুবিধা রয়েছে , যাতে আপনি প্রত্যাশিত এবং অপ্রত্যাশিত ত্রুটির মধ্যে পার্থক্য করতে পারেন:
সি # :
try
{
var example = DoSomething();
}
catch (ExpectedException e)
{
DoSomethingElse(e);
}
এই উদাহরণটি অন্যান্য অপ্রত্যাশিত ব্যতিক্রমগুলি প্রবাহিত হতে এবং অন্য কোথাও হ্যান্ডেল করার অনুমতি দেয় (যেমন লগ হওয়া এবং প্রোগ্রামটি বন্ধ করে দিয়ে)।
জাভাস্ক্রিপ্টে, এই নির্মাণটি এর মাধ্যমে প্রতিরূপ করা যেতে পারে:
try {
let example = doSomething();
} catch (e) {
if (e instanceOf ExpectedError) {
DoSomethingElse(e);
} else {
throw e;
}
}
হিসাবে মার্জিত না, এটি অস্বাভাবিক কারণ কারণ অংশ।
ক্রিয়াকলাপ
আসুন ফাংশন সম্পর্কে কথা বলা যাক।
আপনি যদি একক দায়িত্বের নীতিটি ব্যবহার করেন তবে প্রতিটি শ্রেণি এবং ফাংশনটির একক উদ্দেশ্যে কাজ করা উচিত।
উদাহরণস্বরূপ authenticate()
কোনও ব্যবহারকারীর প্রমাণীকরণ হতে পারে।
এটি হিসাবে লিখিত হতে পারে:
const user = authenticate();
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
বিকল্পভাবে এটি লিখিত হতে পারে:
try {
const user = authenticate();
// keep doing stuff
} catch (e) {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
}
উভয়ই গ্রহণযোগ্য।
অঙ্গীকার
প্রতিশ্রুতি সম্পর্কে কথা বলা যাক।
প্রতিশ্রুতি একটি অ্যাসিনক্রোনাস ফর্ম হয় try..catch
। কলিং new Promise
বা Promise.resolve
আপনার try
কোড শুরু । কল করে throw
বা Promise.reject
আপনাকে catch
কোডে প্রেরণ করে ।
Promise.resolve(value) // try
.then(doSomething) // try
.then(doSomethingElse) // try
.catch(handleError) // catch
কোনও ব্যবহারকারীর অনুমোদনের জন্য আপনার যদি অ্যাসিক্রোনাস ফাংশন থাকে তবে আপনি এটি লিখতে পারেন:
authenticate()
.then((user) => {
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
});
বিকল্পভাবে এটি লিখিত হতে পারে:
authenticate()
.then((user) => {
// keep doing stuff
})
.catch((e) => {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
});
উভয়ই গ্রহণযোগ্য।
পাখির
বাসা বাঁধার কথা বলি।
try..catch
নেস্টেড হতে পারে। আপনার authenticate()
পদ্ধতি অভ্যন্তরীণভাবে একটি try..catch
ব্লক থাকতে পারে যেমন:
try {
const credentials = requestCredentialsFromUser();
const user = getUserFromServer(credentials);
} catch (e) {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
}
তেমনি প্রতিশ্রুতি বাসা বাঁধতে পারে। আপনার অ্যাসিঙ্ক authenticate()
পদ্ধতিটি অভ্যন্তরীণভাবে প্রতিশ্রুতিগুলি ব্যবহার করতে পারে:
requestCredentialsFromUser()
.then(getUserFromServer)
.catch((e) => {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
});
তাহলে উত্তর কী?
ঠিক আছে, আমি মনে করি আসলে এই প্রশ্নের উত্তর দেওয়ার সময় এসেছে:
প্রমাণীকরণে ব্যর্থতা এমন কোনও বিষয় হিসাবে বিবেচিত যা আপনি প্রতিশ্রুতি প্রত্যাখ্যান করবেন?
আমি যে সহজ উত্তর দিতে পারি তা হ'ল যে কোনও প্রতিশ্রুতি আপনি যে কোনও জায়গায় প্রত্যাখ্যান করতে পারেন অন্যথায় throw
যদি আপনি এটির সিঙ্ক্রোনাস কোড হয় তবে কোনও ব্যতিক্রম চান ।
if
আপনার then
বিবৃতিতে কয়েকটি পরীক্ষা করে যদি আপনার নিয়ন্ত্রণ প্রবাহ সহজ হয় তবে কোনও প্রতিশ্রুতি প্রত্যাখ্যান করার দরকার নেই।
যদি আপনার নিয়ন্ত্রণ প্রবাহ কোনও প্রতিশ্রুতি প্রত্যাখ্যান করে এবং তারপরে আপনার ত্রুটি পরিচালনার কোডে ত্রুটিগুলির প্রকারগুলি পরীক্ষা করে যদি সহজ হয় তবে তার পরিবর্তে এটি করুন।
reject
এবং মিথ্যা ফিরে না, কিন্তু আপনি যদি মান আশা করছি একটি হতেBool
, তাহলে আপনি ছিলেন সফল এবং আপনি bool সঙ্গে মান নির্বিশেষে সমাধান করা উচিত নয়। প্রতিশ্রুতি মানগুলির জন্য এক প্রকারের প্রক্সি - তারা প্রত্যাবর্তিত মান সংরক্ষণ করে, তাই কেবল যদি মানটি পাওয়া যায় না তবে আপনার উচিতreject
। অন্যথায় আপনার উচিতresolve
।