স্থিতিস্থাপক ও ব্যবহারকারী-বান্ধব অ্যাপ্লিকেশন তৈরির জন্য রিঅ্যাক্ট এরর বাউন্ডারি আয়ত্ত করুন। সেরা অনুশীলন, বাস্তবায়ন কৌশল এবং উন্নত ত্রুটি মোকাবিলার পদ্ধতি শিখুন।
রিঅ্যাক্ট এরর বাউন্ডারি: শক্তিশালী অ্যাপ্লিকেশনের জন্য ত্রুটি সামলানোর কৌশল
ওয়েব ডেভেলপমেন্টের গতিশীল জগতে, শক্তিশালী এবং ব্যবহারকারী-বান্ধব অ্যাপ্লিকেশন তৈরি করা অত্যন্ত গুরুত্বপূর্ণ। রিঅ্যাক্ট, ইউজার ইন্টারফেস তৈরির জন্য একটি জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরি, ত্রুটিগুলিকে সুন্দরভাবে পরিচালনা করার জন্য একটি শক্তিশালী ব্যবস্থা প্রদান করে: এরর বাউন্ডারি (Error Boundaries)। এই বিশদ নির্দেশিকাটি এরর বাউন্ডারির ধারণা, এর উদ্দেশ্য, বাস্তবায়ন এবং স্থিতিস্থাপক রিঅ্যাক্ট অ্যাপ্লিকেশন তৈরির সেরা অনুশীলনগুলি নিয়ে আলোচনা করে।
এরর বাউন্ডারির প্রয়োজনীয়তা বোঝা
যেকোনো কোডের মতোই, রিঅ্যাক্ট কম্পোনেন্টগুলোতেও ত্রুটি হতে পারে। এই ত্রুটিগুলো বিভিন্ন উৎস থেকে আসতে পারে, যার মধ্যে রয়েছে:
- অপ্রত্যাশিত ডেটা: কম্পোনেন্টগুলো অপ্রত্যাশিত ফরম্যাটে ডেটা পেতে পারে, যা রেন্ডারিং সমস্যা তৈরি করতে পারে।
- লজিক এরর: কম্পোনেন্টের লজিকে থাকা বাগ অপ্রত্যাশিত আচরণ এবং ত্রুটির কারণ হতে পারে।
- এক্সটার্নাল ডিপেন্ডেন্সি: এক্সটার্নাল লাইব্রেরি বা API-এর সমস্যা আপনার কম্পোনেন্টে ত্রুটি ছড়াতে পারে।
সঠিক এরর হ্যান্ডলিং ছাড়া, একটি রিঅ্যাক্ট কম্পোনেন্টের ত্রুটি পুরো অ্যাপ্লিকেশনটিকে ক্র্যাশ করতে পারে, যা ব্যবহারকারীর জন্য একটি খারাপ অভিজ্ঞতা তৈরি করে। এরর বাউন্ডারি এই ত্রুটিগুলি ধরার এবং কম্পোনেন্ট ট্রিতে ছড়িয়ে পড়া থেকে আটকানোর একটি উপায় প্রদান করে, এটি নিশ্চিত করে যে অ্যাপ্লিকেশনটি কার্যকরী থাকবে এমনকি যখন স্বতন্ত্র কম্পোনেন্টগুলো ব্যর্থ হয়।
রিঅ্যাক্ট এরর বাউন্ডারি কী?
এরর বাউন্ডারি হলো রিঅ্যাক্ট কম্পোনেন্ট যা তাদের চাইল্ড কম্পোনেন্ট ট্রিতে যেকোনো জায়গায় জাভাস্ক্রিপ্ট এরর ধরতে পারে, সেই এররগুলো লগ করে, এবং ক্র্যাশ হওয়া কম্পোনেন্ট ট্রির পরিবর্তে একটি ফলব্যাক UI প্রদর্শন করে। এটি একটি সুরক্ষা জালের মতো কাজ করে, যা ত্রুটিকে পুরো অ্যাপ্লিকেশন ক্র্যাশ করা থেকে বিরত রাখে।
এরর বাউন্ডারির মূল বৈশিষ্ট্য:
- শুধুমাত্র ক্লাস কম্পোনেন্ট: এরর বাউন্ডারি অবশ্যই ক্লাস কম্পোনেন্ট হিসেবে বাস্তবায়ন করতে হবে। ফাংশনাল কম্পোনেন্ট এবং হুক ব্যবহার করে এরর বাউন্ডারি তৈরি করা যায় না।
- লাইফসাইকেল মেথড: এরা ত্রুটিগুলি পরিচালনা করতে নির্দিষ্ট লাইফসাইকেল মেথড,
static getDerivedStateFromError()
এবংcomponentDidCatch()
ব্যবহার করে। - স্থানীয় এরর হ্যান্ডলিং: এরর বাউন্ডারি শুধুমাত্র তাদের চাইল্ড কম্পোনেন্টের ত্রুটি ধরে, নিজেদের মধ্যে নয়।
এরর বাউন্ডারি বাস্তবায়ন করা
আসুন একটি বেসিক এরর বাউন্ডারি কম্পোনেন্ট তৈরির প্রক্রিয়াটি ধাপে ধাপে দেখি:
১. এরর বাউন্ডারি কম্পোনেন্ট তৈরি করা
প্রথমে, একটি নতুন ক্লাস কম্পোনেন্ট তৈরি করুন, উদাহরণস্বরূপ, ErrorBoundary
নামে:
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return {
hasError: true
};
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error("Caught error: ", error, errorInfo);
// Example: logErrorToMyService(error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return (
<div>
<h2>Something went wrong.</h2>
<details style={{ whiteSpace: 'pre-wrap' }}>
{this.state.error && this.state.error.toString()}
<br />
{this.state.errorInfo.componentStack}
</details>
</div>
);
}
return this.props.children;
}
}
export default ErrorBoundary;
ব্যাখ্যা:
- কনস্ট্রাক্টর: কম্পোনেন্টের স্টেট
hasError: false
দিয়ে শুরু করে। static getDerivedStateFromError(error)
: এই লাইফসাইকেল মেথডটি একটি ডিসেন্ডেন্ট কম্পোনেন্ট দ্বারা একটি ত্রুটি থ্রো করার পরে কল করা হয়। এটি আর্গুমেন্ট হিসেবে ত্রুটিটি গ্রহণ করে এবং আপনাকে কম্পোনেন্টের স্টেট আপডেট করার সুযোগ দেয়। এখানে, আমরা ফলব্যাক UI ট্রিগার করার জন্যhasError
কেtrue
তে সেট করি। এটি একটিstatic
মেথড, তাই আপনি ফাংশনের ভিতরেthis
ব্যবহার করতে পারবেন না।componentDidCatch(error, errorInfo)
: এই লাইফসাইকেল মেথডটি একটি ডিসেন্ডেন্ট কম্পোনেন্ট দ্বারা একটি ত্রুটি থ্রো করার পরে কল করা হয়। এটি দুটি আর্গুমেন্ট গ্রহণ করে:error
: যে ত্রুটিটি থ্রো করা হয়েছিল।errorInfo
: একটি অবজেক্ট যাতে কম্পোনেন্ট স্ট্যাক সম্পর্কে তথ্য থাকে যেখানে ত্রুটিটি ঘটেছে। এটি ডিবাগিংয়ের জন্য অমূল্য।
এই মেথডের মধ্যে, আপনি Sentry, Rollbar, বা একটি কাস্টম লগিং সলিউশনের মতো একটি পরিষেবাতে ত্রুটিটি লগ করতে পারেন। এই ফাংশনের মধ্যে সরাসরি ত্রুটিটি পুনরায় রেন্ডার বা ঠিক করার চেষ্টা করা থেকে বিরত থাকুন; এর প্রাথমিক উদ্দেশ্য হল সমস্যাটি লগ করা।
render()
: রেন্ডার মেথডhasError
স্টেট পরীক্ষা করে। যদি এটিtrue
হয়, তবে এটি একটি ফলব্যাক UI রেন্ডার করে (এই ক্ষেত্রে, একটি সাধারণ ত্রুটি বার্তা)। অন্যথায়, এটি কম্পোনেন্টের চিলড্রেন রেন্ডার করে।
২. এরর বাউন্ডারি ব্যবহার করা
এরর বাউন্ডারি ব্যবহার করতে, যে কম্পোনেন্টে ত্রুটি হতে পারে সেটিকে ErrorBoundary
কম্পোনেন্ট দিয়ে র্যাপ করুন:
import ErrorBoundary from './ErrorBoundary';
function MyComponent() {
// This component might throw an error
return (
<ErrorBoundary>
<PotentiallyBreakingComponent />
</ErrorBoundary>
);
}
export default MyComponent;
যদি PotentiallyBreakingComponent
একটি ত্রুটি থ্রো করে, ErrorBoundary
এটি ধরবে, ত্রুটিটি লগ করবে, এবং ফলব্যাক UI রেন্ডার করবে।
৩. গ্লোবাল কনটেক্সট সহ উদাহরণ
একটি ই-কমার্স অ্যাপ্লিকেশনের কথা ভাবুন যা একটি রিমোট সার্ভার থেকে আনা পণ্যের তথ্য প্রদর্শন করে। একটি কম্পোনেন্ট, ProductDisplay
, পণ্যের বিবরণ রেন্ডার করার জন্য দায়ী। তবে, সার্ভার মাঝে মাঝে অপ্রত্যাশিত ডেটা ফেরত দিতে পারে, যা রেন্ডারিং ত্রুটির কারণ হতে পারে।
// ProductDisplay.js
import React from 'react';
function ProductDisplay({ product }) {
// Simulate a potential error if product.price is not a number
if (typeof product.price !== 'number') {
throw new Error('Invalid product price');
}
return (
<div>
<h2>{product.name}</h2>
<p>Price: {product.price}</p>
<img src={product.imageUrl} alt={product.name} />
</div>
);
}
export default ProductDisplay;
এই ধরনের ত্রুটি থেকে রক্ষা পেতে, ProductDisplay
কম্পোনেন্টটিকে একটি ErrorBoundary
দিয়ে র্যাপ করুন:
// App.js
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import ProductDisplay from './ProductDisplay';
function App() {
const product = {
name: 'Example Product',
price: 'Not a Number', // Intentionally incorrect data
imageUrl: 'https://example.com/image.jpg'
};
return (
<div>
<ErrorBoundary>
<ProductDisplay product={product} />
</ErrorBoundary>
</div>
);
}
export default App;
এই পরিস্থিতিতে, যেহেতু product.price
ইচ্ছাকৃতভাবে একটি স্ট্রিং হিসাবে সেট করা হয়েছে সংখ্যার পরিবর্তে, ProductDisplay
কম্পোনেন্ট একটি ত্রুটি থ্রো করবে। ErrorBoundary
এই ত্রুটিটি ধরবে, পুরো অ্যাপ্লিকেশনটিকে ক্র্যাশ করা থেকে বিরত রাখবে, এবং ভাঙা ProductDisplay
কম্পোনেন্টের পরিবর্তে ফলব্যাক UI প্রদর্শন করবে।
৪. আন্তর্জাতিক অ্যাপ্লিকেশনে এরর বাউন্ডারি
বিশ্বব্যাপী ব্যবহারকারীদের জন্য অ্যাপ্লিকেশন তৈরি করার সময়, ভালো ব্যবহারকারীর অভিজ্ঞতা দেওয়ার জন্য ত্রুটির বার্তাগুলো স্থানীয়করণ করা উচিত। এরর বাউন্ডারি অনূদিত ত্রুটি বার্তা প্রদর্শনের জন্য আন্তর্জাতিকীকরণ (i18n) লাইব্রেরির সাথে ব্যবহার করা যেতে পারে।
// ErrorBoundary.js (with i18n support)
import React from 'react';
import { useTranslation } from 'react-i18next'; // Assuming you're using react-i18next
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false,
error: null,
errorInfo: null,
};
}
static getDerivedStateFromError(error) {
return {
hasError: true,
error: error,
};
}
componentDidCatch(error, errorInfo) {
console.error("Caught error: ", error, errorInfo);
this.setState({errorInfo: errorInfo});
}
render() {
if (this.state.hasError) {
return (
<FallbackUI error={this.state.error} errorInfo={this.state.errorInfo}/>
);
}
return this.props.children;
}
}
const FallbackUI = ({error, errorInfo}) => {
const { t } = useTranslation();
return (
<div>
<h2>{t('error.title')}</h2>
<p>{t('error.message')}</p>
<details style={{ whiteSpace: 'pre-wrap' }}>
{error && error.toString()}<br />
{errorInfo?.componentStack}
</details>
</div>
);
}
export default ErrorBoundary;
এই উদাহরণে, আমরা ফলব্যাক UI-তে ত্রুটির শিরোনাম এবং বার্তা অনুবাদ করতে react-i18next
ব্যবহার করি। t('error.title')
এবং t('error.message')
ফাংশনগুলো ব্যবহারকারীর নির্বাচিত ভাষার উপর ভিত্তি করে উপযুক্ত অনুবাদ পুনরুদ্ধার করবে।
৫. সার্ভার-সাইড রেন্ডারিং (SSR) এর জন্য বিবেচ্য বিষয়
সার্ভার-সাইড রেন্ডার করা অ্যাপ্লিকেশনগুলিতে এরর বাউন্ডারি ব্যবহার করার সময়, সার্ভারকে ক্র্যাশ হওয়া থেকে রক্ষা করার জন্য ত্রুটিগুলি সঠিকভাবে পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। রিঅ্যাক্টের ডকুমেন্টেশন পরামর্শ দেয় যে সার্ভারে রেন্ডারিং ত্রুটি থেকে পুনরুদ্ধার করার জন্য এরর বাউন্ডারি ব্যবহার করা এড়িয়ে চলুন। পরিবর্তে, কম্পোনেন্ট রেন্ডার করার আগে ত্রুটিগুলি পরিচালনা করুন, অথবা সার্ভারে একটি স্ট্যাটিক ত্রুটি পৃষ্ঠা রেন্ডার করুন।
এরর বাউন্ডারি ব্যবহারের সেরা অনুশীলন
- ছোট কম্পোনেন্ট র্যাপ করুন: স্বতন্ত্র কম্পোনেন্ট বা আপনার অ্যাপ্লিকেশনের ছোট অংশগুলো এরর বাউন্ডারি দিয়ে র্যাপ করুন। এটি একটি একক ত্রুটিকে পুরো UI ক্র্যাশ করা থেকে বিরত রাখে। পুরো অ্যাপ্লিকেশনটির পরিবর্তে নির্দিষ্ট বৈশিষ্ট্য বা মডিউলগুলি র্যাপ করার কথা বিবেচনা করুন।
- ত্রুটি লগ করুন: একটি মনিটরিং পরিষেবাতে ত্রুটি লগ করতে
componentDidCatch()
মেথডটি ব্যবহার করুন। এটি আপনাকে আপনার অ্যাপ্লিকেশনের সমস্যাগুলি ট্র্যাক এবং সমাধান করতে সহায়তা করে। Sentry, Rollbar এবং Bugsnag এর মতো পরিষেবাগুলি ত্রুটি ট্র্যাকিং এবং রিপোর্টিংয়ের জন্য জনপ্রিয় পছন্দ। - তথ্যবহুল ফলব্যাক UI প্রদান করুন: ফলব্যাক UI-তে একটি ব্যবহারকারী-বান্ধব ত্রুটির বার্তা প্রদর্শন করুন। প্রযুক্তিগত পরিভাষা এড়িয়ে চলুন এবং কীভাবে এগিয়ে যেতে হবে তার নির্দেশাবলী প্রদান করুন (যেমন, পৃষ্ঠাটি রিফ্রেশ করুন, সহায়তার সাথে যোগাযোগ করুন)। সম্ভব হলে, ব্যবহারকারী নিতে পারে এমন বিকল্প কর্মের পরামর্শ দিন।
- অতিরিক্ত ব্যবহার করবেন না: প্রতিটি একক কম্পোনেন্টকে একটি এরর বাউন্ডারি দিয়ে র্যাপ করা এড়িয়ে চলুন। এমন এলাকাগুলিতে মনোযোগ দিন যেখানে ত্রুটি হওয়ার সম্ভাবনা বেশি, যেমন বাহ্যিক API থেকে ডেটা আনা বা জটিল ব্যবহারকারী ইন্টারঅ্যাকশন পরিচালনা করা কম্পোনেন্টগুলো।
- এরর বাউন্ডারি পরীক্ষা করুন: আপনার এরর বাউন্ডারিগুলি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করতে সেগুলিতে র্যাপ করা কম্পোনেন্টগুলিতে ইচ্ছাকৃতভাবে ত্রুটি থ্রো করুন। ফলব্যাক UI প্রত্যাশিতভাবে প্রদর্শিত হচ্ছে এবং ত্রুটিগুলি সঠিকভাবে লগ করা হচ্ছে কিনা তা যাচাই করার জন্য ইউনিট টেস্ট বা ইন্টিগ্রেশন টেস্ট লিখুন।
- এরর বাউন্ডারি এর জন্য নয়:
- ইভেন্ট হ্যান্ডলার
- অ্যাসিঙ্ক্রোনাস কোড (যেমন,
setTimeout
বাrequestAnimationFrame
কলব্যাক) - সার্ভার-সাইড রেন্ডারিং
- এরর বাউন্ডারির নিজের মধ্যে থ্রো করা ত্রুটি (তার চিলড্রেনের পরিবর্তে)
উন্নত এরর হ্যান্ডলিং কৌশল
১. রিট্রাই মেকানিজম
কিছু ক্ষেত্রে, যে অপারেশনটি ত্রুটির কারণ হয়েছে তা পুনরায় চেষ্টা করে একটি ত্রুটি থেকে পুনরুদ্ধার করা সম্ভব হতে পারে। উদাহরণস্বরূপ, যদি একটি নেটওয়ার্ক অনুরোধ ব্যর্থ হয়, আপনি একটি সংক্ষিপ্ত বিলম্বের পরে এটি পুনরায় চেষ্টা করতে পারেন। এরর বাউন্ডারি একটি আরও স্থিতিস্থাপক ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য রিট্রাই মেকানিজমের সাথে একত্রিত করা যেতে পারে।
// ErrorBoundaryWithRetry.js
import React from 'react';
class ErrorBoundaryWithRetry extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false,
retryCount: 0,
};
}
static getDerivedStateFromError(error) {
return {
hasError: true,
};
}
componentDidCatch(error, errorInfo) {
console.error("Caught error: ", error, errorInfo);
}
handleRetry = () => {
this.setState(prevState => ({
hasError: false,
retryCount: prevState.retryCount + 1,
}), () => {
// This forces the component to re-render. Consider better patterns with controlled props.
this.forceUpdate(); // WARNING: Use with caution
if (this.props.onRetry) {
this.props.onRetry();
}
});
};
render() {
if (this.state.hasError) {
return (
<div>
<h2>Something went wrong.</h2>
<button onClick={this.handleRetry}>Retry</button>
</div>
);
}
return this.props.children;
}
}
export default ErrorBoundaryWithRetry;
ErrorBoundaryWithRetry
কম্পোনেন্টে একটি রিট্রাই বোতাম রয়েছে যা ক্লিক করলে hasError
স্টেট রিসেট করে এবং চাইল্ড কম্পোনেন্টগুলি পুনরায় রেন্ডার করে। আপনি রিট্রাইয়ের সংখ্যা সীমিত করতে একটি retryCount
যোগ করতে পারেন। এই পদ্ধতিটি ক্ষণস্থায়ী ত্রুটি, যেমন অস্থায়ী নেটওয়ার্ক বিভ্রাট, পরিচালনা করার জন্য বিশেষভাবে কার্যকর হতে পারে। নিশ্চিত করুন যে `onRetry` প্রপটি সঠিকভাবে পরিচালিত হয় এবং যে লজিকটিতে ত্রুটি হয়েছিল সেটি পুনরায় ডেটা আনা/পুনরায় কার্যকর করা হয়।
২. ফিচার ফ্ল্যাগ
ফিচার ফ্ল্যাগ আপনাকে নতুন কোড স্থাপন না করেই আপনার অ্যাপ্লিকেশনের বৈশিষ্ট্যগুলি গতিশীলভাবে সক্রিয় বা নিষ্ক্রিয় করতে দেয়। এরর বাউন্ডারি একটি ত্রুটির ক্ষেত্রে কার্যকারিতা সুন্দরভাবে হ্রাস করার জন্য ফিচার ফ্ল্যাগের সাথে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, যদি একটি নির্দিষ্ট বৈশিষ্ট্য ত্রুটির কারণ হয়, আপনি একটি ফিচার ফ্ল্যাগ ব্যবহার করে এটি নিষ্ক্রিয় করতে পারেন এবং ব্যবহারকারীকে একটি বার্তা প্রদর্শন করতে পারেন যে বৈশিষ্ট্যটি সাময়িকভাবে अनुपलब्ध।
৩. সার্কিট ব্রেকার প্যাটার্ন
সার্কিট ব্রেকার প্যাটার্ন একটি সফটওয়্যার ডিজাইন প্যাটার্ন যা একটি অ্যাপ্লিকেশনকে বারবার এমন একটি অপারেশন চালানোর চেষ্টা করা থেকে বিরত রাখতে ব্যবহৃত হয় যা ব্যর্থ হওয়ার সম্ভাবনা বেশি। এটি একটি অপারেশনের সফলতা এবং ব্যর্থতার হার পর্যবেক্ষণ করে কাজ করে এবং যদি ব্যর্থতার হার একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করে, তবে "সার্কিট খুলে দেয়" এবং একটি নির্দিষ্ট সময়ের জন্য অপারেশনটি চালানোর পরবর্তী প্রচেষ্টা বন্ধ করে দেয়। এটি ক্যাসকেডিং ব্যর্থতা প্রতিরোধ করতে এবং অ্যাপ্লিকেশনের সামগ্রিক স্থিতিশীলতা উন্নত করতে সহায়তা করতে পারে।
এরর বাউন্ডারি রিঅ্যাক্ট অ্যাপ্লিকেশনগুলিতে সার্কিট ব্রেকার প্যাটার্ন বাস্তবায়ন করতে ব্যবহার করা যেতে পারে। যখন একটি এরর বাউন্ডারি একটি ত্রুটি ধরে, তখন এটি একটি ব্যর্থতা কাউন্টার বৃদ্ধি করতে পারে। যদি ব্যর্থতা কাউন্টার একটি থ্রেশহোল্ড অতিক্রম করে, এরর বাউন্ডারি ব্যবহারকারীকে একটি বার্তা প্রদর্শন করতে পারে যে বৈশিষ্ট্যটি সাময়িকভাবে अनुपलब्ध এবং অপারেশনটি চালানোর পরবর্তী প্রচেষ্টা বন্ধ করে দেয়। একটি নির্দিষ্ট সময় পরে, এরর বাউন্ডারি "সার্কিট বন্ধ করতে" পারে এবং অপারেশনটি চালানোর প্রচেষ্টা পুনরায় অনুমতি দিতে পারে।
উপসংহার
শক্তিশালী এবং ব্যবহারকারী-বান্ধব অ্যাপ্লিকেশন তৈরির জন্য রিঅ্যাক্ট এরর বাউন্ডারি একটি অপরিহার্য টুল। এরর বাউন্ডারি বাস্তবায়ন করে, আপনি আপনার পুরো অ্যাপ্লিকেশনকে ক্র্যাশ হওয়া থেকে রক্ষা করতে পারেন, আপনার ব্যবহারকারীদের একটি সুন্দর ফলব্যাক UI প্রদান করতে পারেন এবং ডিবাগিং এবং বিশ্লেষণের জন্য মনিটরিং পরিষেবাগুলিতে ত্রুটি লগ করতে পারেন। এই নির্দেশিকায় বর্ণিত সেরা অনুশীলন এবং উন্নত কৌশলগুলি অনুসরণ করে, আপনি এমন রিঅ্যাক্ট অ্যাপ্লিকেশন তৈরি করতে পারেন যা স্থিতিস্থাপক, নির্ভরযোগ্য এবং অপ্রত্যাশিত ত্রুটির মুখেও একটি ইতিবাচক ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। বিশ্বব্যাপী দর্শকদের জন্য স্থানীয়করণ করা সহায়ক ত্রুটি বার্তা প্রদানে মনোযোগ দিতে মনে রাখবেন।