RxJS (Reactive Extensions for JavaScript) অ্যাসিঙ্ক্রোনাস এবং ইভেন্ট-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য একটি শক্তিশালী লাইব্রেরি। তবে, যেকোন অ্যাসিঙ্ক্রোনাস অপারেশন বা স্ট্রিমের সময় Error Handling একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ ডেটার প্রতি নিয়ন্ত্রণ এবং প্রসেসিংয়ের সময় বিভিন্ন ধরনের সমস্যা বা ত্রুটি (error) হতে পারে। RxJS-এ error handling করতে কয়েকটি প্র্যাকটিস রয়েছে, যেগুলি অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং ব্যতিক্রমী পরিস্থিতির জন্য প্রস্তুত রাখে।
এখানে আমরা আলোচনা করবো RxJS তে Error Handling এর কিছু Best Practices।
1. catchError() ব্যবহার করা
catchError() অপারেটরটি যখন কোন error ঘটবে, তখন সেই error-টি হ্যান্ডেল করার জন্য ব্যবহার করা হয়। এটি একটি observable রিটার্ন করে, যা error এর পরে কোনো বিকল্প Observable প্রদান করে।
ব্যবহার:
- Error Handling:
catchError()ব্যবহার করলে আপনি error হওয়ার পর fallback অথবা alternative Observable ব্যবহার করতে পারবেন।
উদাহরণ:
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
const observable = throwError('Something went wrong');
observable.pipe(
catchError(err => {
console.error('Caught error:', err);
return of('Fallback Value'); // Fallback value
})
).subscribe(
data => console.log(data),
error => console.error('Error:', error)
);
ব্যাখ্যা:
- যখন
observableএ throwError() থেকে error হবে, তখনcatchError()সেই error ধরবে এবং একটি fallback Observable (of('Fallback Value')) রিটার্ন করবে। - এখানে, error হ্যান্ডলিংয়ের মাধ্যমে স্ট্রিম অব্যাহত থাকবে, এবং সাবস্ক্রাইবারে fallback value পৌঁছাবে।
2. retry() এবং retryWhen() ব্যবহার করা
retry() এবং retryWhen() অপারেটরগুলি retrying অথবা পুনরায় চেষ্টা করার জন্য ব্যবহৃত হয়। এটি error ঘটলে, নির্দিষ্ট সংখ্যক বার পুনরায় try করার সুযোগ দেয়।
ব্যবহার:
- Retry Mechanism: যখন কোন অস্থায়ী সমস্যা ঘটে (যেমন নেটওয়ার্ক সমস্যা), তখন retry অপারেটর ব্যবহার করা যায় যাতে স্ট্রিম পুনরায় সফলভাবে সম্পন্ন হয়।
উদাহরণ: retry()
import { of, throwError } from 'rxjs';
import { retry } from 'rxjs/operators';
const observable = throwError('Temporary network issue');
observable.pipe(
retry(2) // Retry 2 times
).subscribe(
data => console.log(data),
error => console.error('Error:', error)
);
ব্যাখ্যা:
retry(2)ব্যবহার করে, প্রথম error হওয়ার পর ২ বার পুনরায় চেষ্টা করা হবে। এর পরে error হলে, তা সাবস্ক্রাইবারের কাছে পাঠানো হবে।
উদাহরণ: retryWhen()
import { of, throwError } from 'rxjs';
import { retryWhen, delay, take } from 'rxjs/operators';
const observable = throwError('Temporary network issue');
observable.pipe(
retryWhen(errors =>
errors.pipe(
delay(1000), // 1 second delay
take(3) // Retry 3 times
)
)
).subscribe(
data => console.log(data),
error => console.error('Error:', error)
);
ব্যাখ্যা:
retryWhen()ব্যবহার করে, error হলে, retry করতে 1 সেকেন্ডের delay দেওয়া হয় এবং সর্বোচ্চ ৩ বার retry করার পরে error পাঠানো হয়।
3. finalize() ব্যবহার করা
finalize() অপারেটরটি স্ট্রিমের শেষ হওয়া (complete বা error হওয়ার পর) পরে কিছু কাজ সম্পন্ন করার জন্য ব্যবহার করা হয়। এটি কোনো clean-up বা log করার কাজে ব্যবহার করা যেতে পারে।
ব্যবহার:
- Resource Cleanup: স্ট্রিম বন্ধ হওয়ার পর যেমন error বা completion, তখন কিছু ক্লিন-আপ কোড বা লগিং কাজ করতে সাহায্য করে।
উদাহরণ:
import { of } from 'rxjs';
import { finalize } from 'rxjs/operators';
const observable = of('Data');
observable.pipe(
finalize(() => {
console.log('Stream has completed or errored');
})
).subscribe(
data => console.log(data),
error => console.error('Error:', error)
);
ব্যাখ্যা:
- স্ট্রিম শেষ হলে,
finalize()কল হবে এবং এটি লগ করবে "Stream has completed or errored"। এই অপারেটরটি error বা completion পরেও ক্লিন-আপ বা লগিং করার জন্য উপকারী।
4. throwError() এবং catchError() এর সঠিক ব্যবহার
throwError() অপারেটরটি ব্যবহার করে আপনি একটি error manually throw করতে পারেন। এটি সাধারণত error generation এবং propagation এর জন্য ব্যবহৃত হয়।
উদাহরণ: throwError() + catchError()
import { throwError, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
const observable = throwError('Something went wrong');
observable.pipe(
catchError(err => {
console.error('Error caught:', err);
return of('Recovered with fallback data');
})
).subscribe(
data => console.log(data),
error => console.error('Final Error:', error)
);
ব্যাখ্যা:
throwError()দ্বারা error ঘটানোর পর,catchError()সেই error হ্যান্ডেল করে একটি fallback Observable রিটার্ন করে এবং সাবস্ক্রাইবারে fallback ডেটা পাঠানো হয়।
5. onErrorResumeNext() ব্যবহার করা
onErrorResumeNext() অপারেটরটি স্ট্রিমে error ঘটলে, error না তুলে পরবর্তী Observable গুলো চালু রাখে। এটি error ঘটলে স্ট্রিমের অব্যাহত রাখতে সহায়ক।
উদাহরণ:
import { of, throwError } from 'rxjs';
import { onErrorResumeNext } from 'rxjs/operators';
const observable = throwError('Error occurred').pipe(
onErrorResumeNext(of('Next observable'))
);
observable.subscribe(
data => console.log(data),
error => console.error('Error:', error)
);
ব্যাখ্যা:
onErrorResumeNext()error ঘটলেও পরবর্তী Observable (of('Next observable')) চালু থাকবে এবং সাবস্ক্রাইবারকে পাঠানো হবে।
6. User-Friendly Error Messages
User-friendly error messages তৈরি করা খুবই গুরুত্বপূর্ণ। RxJS এ যখন error ফেলে, তখন তা সাধারণত raw error message হিসেবে আসে। তবে, আপনি catchError() এর মাধ্যমে আরও ব্যবহারকারী-বান্ধব ত্রুটি বার্তা প্রদান করতে পারেন।
উদাহরণ:
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
const observable = of('Data');
observable.pipe(
catchError(error => {
return of('Oops! Something went wrong. Please try again later.');
})
).subscribe(data => {
console.log(data);
});
ব্যাখ্যা:
- catchError() ত্রুটি হলে, এটি ব্যবহারকারী-বান্ধব একটি বার্তা রিটার্ন করবে, যা ব্যবহারকারীর কাছে বুঝতে সহজ হবে।
সারাংশ
RxJS তে error handling এর জন্য কিছু গুরুত্বপূর্ণ best practices হল:
- catchError() ব্যবহার করে ত্রুটি হ্যান্ডলিং করা এবং fallback Observable প্রদান করা।
- retry() এবং retryWhen() ব্যবহার করে নির্দিষ্ট সংখ্যক retry করা।
- finalize() ব্যবহার করে স্ট্রিম শেষ হওয়ার পরে কিছু কাজ করা (যেমন ক্লিন-আপ বা লগিং)।
- throwError() দিয়ে error manually throw করা এবং তা হ্যান্ডল করা।
- onErrorResumeNext() দিয়ে error ঘটলেও পরবর্তী Observable চালু রাখা।
- ব্যবহারকারী-বান্ধব error messages প্রদান করা।
এই প্র্যাকটিসগুলো RxJS-এ error handling এর কার্যকারিতা বাড়ায় এবং আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল করে তোলে।
Read more