Error handling একটি গুরুত্বপূর্ণ বিষয়, বিশেষত যখন আপনি একটি অ্যাপ্লিকেশন বা সার্ভিস তৈরি করছেন যা বিভিন্ন ধরনের ত্রুটি বা সমস্যা মোকাবেলা করতে পারে। Custom error handling আপনাকে আপনার অ্যাপ্লিকেশনে ত্রুটি পরিস্থিতি চিহ্নিত করার, সেই ত্রুটির জন্য উপযুক্ত বার্তা প্রদর্শন করার, এবং ব্যবহারকারী বা ডেভেলপারদের জন্য একটি সুসংগঠিত এবং প্রফেশনাল প্রতিক্রিয়া সরবরাহ করার সুযোগ দেয়।
Socket.IO বা সাধারণ Node.js/JavaScript অ্যাপ্লিকেশন ব্যবহারে কাস্টম ত্রুটি পরিচালনা করার কিছু কৌশল নিচে আলোচনা করা হলো।
1. Custom Error Class তৈরি করা
আপনি যখন একটি কাস্টম ত্রুটি তৈরি করেন, তখন এটি একটি বিশেষ ক্লাসের মাধ্যমে আরও বিস্তারিত এবং কাস্টমাইজযোগ্য ত্রুটি বার্তা তৈরি করতে সাহায্য করে। এতে ত্রুটির ধরণ এবং বার্তা পরিষ্কারভাবে ধারণ করা যায়।
Custom Error Class উদাহরণ
class AppError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
}
}
// উদাহরণ: ব্যবহারকারীর অজানা ত্রুটি
const createUser = (userData) => {
if (!userData.name || !userData.email) {
throw new AppError('Missing required fields: name or email', 400);
}
// আরও কোড
};ব্যাখ্যা:
AppErrorকাস্টম এরর ক্লাসটিErrorক্লাস থেকে ইনহেরিট করে। এতে দুটি প্রধান প্যারামিটার আছে:message(ত্রুটির বার্তা) এবংstatusCode(HTTP স্ট্যাটাস কোড)।Error.captureStackTraceএর মাধ্যমে ত্রুটির স্ট্যাক ট্রেস (অথবা কোথায় ত্রুটি ঘটেছে) ট্র্যাক করা হয়।
2. Error Middleware in Express.js
Express.js এ আপনি middleware ব্যবহার করে কাস্টম ত্রুটিগুলি সহজে হ্যান্ডল করতে পারেন। সাধারণত, try-catch block বা async-await এর মাধ্যমে ত্রুটি হ্যান্ডলিং করা হয় এবং তারপর এই middleware তে সেই ত্রুটির স্ট্যাটাস কোড এবং বার্তা পাঠানো হয়।
Error Middleware উদাহরণ
const express = require('express');
const app = express();
// কাস্টম Error Middleware
app.use((err, req, res, next) => {
const statusCode = err.statusCode || 500;
const message = err.message || 'Internal Server Error';
res.status(statusCode).json({
success: false,
message: message,
stack: err.stack,
});
});
// একটি route যেখানে কাস্টম error হ্যান্ডলিং করা হবে
app.get('/error', (req, res, next) => {
const error = new AppError('Something went wrong!', 400);
next(error);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});ব্যাখ্যা:
- আমরা
AppErrorক্লাস ব্যবহার করেছি এবংnext()ফাংশনের মাধ্যমে এটি Express এর error handling middleware এ পাঠানো হয়েছে। app.use()এর মাধ্যমে আমরা middleware এ error গুলি হ্যান্ডল করেছি, যাতে তারা ইউজারের কাছে সহজে পরিস্কারভাবে প্রদর্শিত হয়।
3. Error Logging
কাস্টম error হ্যান্ডলিংয়ের একটি গুরুত্বপূর্ণ অংশ হলো Error Logging, যাতে আপনি জানেন কোথায়, কখন এবং কী কারণে ত্রুটি ঘটেছে। এটি ডিবাগিং এবং অ্যাপ্লিকেশনের নির্ভরযোগ্যতা বাড়ানোর জন্য অপরিহার্য।
Error Logging উদাহরণ (Winston Logger ব্যবহার করে)
const winston = require('winston');
// Logger configuration
const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
],
});
// Error logging function
const logError = (error) => {
logger.error(`Message: ${error.message}, Stack: ${error.stack}`);
};
// উদাহরণ: একটি error ফেলা
const handleError = () => {
try {
throw new AppError('Database connection failed', 500);
} catch (error) {
logError(error);
throw error; // or return a custom response
}
};
handleError();ব্যাখ্যা:
- এখানে Winston ব্যবহার করে error logging setup করা হয়েছে। এটি কনসোল এবং একটি ফাইল (
error.log) উভয় জায়গায় ত্রুটির তথ্য লগ করে। logError()ফাংশনটি ত্রুটির বার্তা এবং স্ট্যাক ট্রেস লগ করে।
4. Graceful Error Handling in Async Functions
async এবং await ব্যবহার করার সময়, আপনি try-catch ব্লক ব্যবহার করে ত্রুটি সঠিকভাবে হ্যান্ডল করতে পারেন। এই কৌশলটি অ্যাসিনক্রনাস ফাংশনগুলিতে ত্রুটি প্রক্রিয়াকরণের জন্য অত্যন্ত কার্যকর।
Async Function এ Error Handling
const getDataFromDatabase = async () => {
try {
// ফেক ডেটাবেস কল
const data = await someAsyncDatabaseCall();
return data;
} catch (error) {
throw new AppError('Database query failed', 500);
}
};
getDataFromDatabase()
.then(data => console.log(data))
.catch(error => console.log(error.message)); // Catch custom errorব্যাখ্যা:
getDataFromDatabase()ফাংশনটি একটি async ফাংশন, যেখানে আমরাawaitব্যবহার করে একটি ডেটাবেস কনসাল্টেশন করি।- যদি কোনো ত্রুটি ঘটে, তবে আমরা একটি কাস্টম
AppErrorছুড়ে দিই এবং সেটি যথাযথভাবে catch করা হয়।
5. Custom Error Pages
ওয়েব অ্যাপ্লিকেশনের জন্য কাস্টম ত্রুটি পেজ তৈরি করা যেতে পারে, যা ইউজারের জন্য প্রফেশনালভাবে ত্রুটি বার্তা প্রদর্শন করে। যেমন 404 Not Found বা 500 Internal Server Error এর জন্য কাস্টম পেজ তৈরি করা।
Custom Error Pages (Express)
app.use((req, res, next) => {
const error = new AppError('Page not found', 404);
next(error);
});
app.use((err, req, res, next) => {
res.status(err.statusCode || 500).render('error', {
message: err.message,
stack: err.stack,
});
});ব্যাখ্যা:
- আমরা একটি কাস্টম 404 error হ্যান্ডলার তৈরি করেছি এবং ত্রুটির বার্তা এবং স্ট্যাক ট্রেস সহ কাস্টম error পেজে রেন্ডার করেছি।
Conclusion
Custom error handling আপনার অ্যাপ্লিকেশনকে শক্তিশালী এবং স্থিতিশীল করে তোলে। এটি user experience উন্নত করতে সাহায্য করে এবং ডেভেলপারদের জন্য সঠিকভাবে ত্রুটি নির্ণয় এবং ডিবাগ করার সুযোগ দেয়। আপনি বিভিন্ন কৌশল যেমন Custom Error Class, Middleware, Error Logging, এবং Graceful Error Handling ব্যবহার করে আপনার অ্যাপ্লিকেশনের ত্রুটি হ্যান্ডলিং সিস্টেম উন্নত করতে পারেন।
Read more