റിയാക്ടിൽ ശക്തമായ എറർ കൈകാര്യത്തിനും തടസ്സങ്ങളില്ലാത്ത യുഐയ്ക്കും വേണ്ടി ജാവാസ്ക്രിപ്റ്റ് എറർ ബൗണ്ടറികൾ മനസ്സിലാക്കുന്നതിനും നടപ്പിലാക്കുന്നതിനുമുള്ള ഒരു പൂർണ്ണമായ വഴികാട്ടി.
ജാവാസ്ക്രിപ്റ്റ് എറർ ബൗണ്ടറി: റിയാക്ടിൽ എറർ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ഒരു വഴികാട്ടി
റിയാക്ട് ഡെവലപ്മെൻ്റിൻ്റെ ലോകത്ത്, അപ്രതീക്ഷിതമായ പിശകുകൾ ഉപയോക്താക്കൾക്ക് നിരാശാജനകമായ അനുഭവങ്ങൾക്കും ആപ്ലിക്കേഷൻ്റെ അസ്ഥിരതയ്ക്കും കാരണമാകും. ശക്തവും വിശ്വസനീയവുമായ ആപ്ലിക്കേഷനുകൾ നിർമ്മിക്കുന്നതിന്, കൃത്യമായി നിർവചിക്കപ്പെട്ട ഒരു എറർ ഹാൻഡ്ലിംഗ് തന്ത്രം അത്യാവശ്യമാണ്. റിയാക്ടിൻ്റെ എറർ ബൗണ്ടറികൾ നിങ്ങളുടെ കമ്പോണൻ്റ് ട്രീയിൽ സംഭവിക്കുന്ന പിശകുകൾ ഭംഗിയായി കൈകാര്യം ചെയ്യാനും, മുഴുവൻ ആപ്ലിക്കേഷനും ക്രാഷ് ആകുന്നത് തടയാനും, പകരം ഒരു ഫാൾബാക്ക് യുഐ കാണിക്കാനും ശക്തമായ ഒരു സംവിധാനം നൽകുന്നു.
എന്താണ് ഒരു എറർ ബൗണ്ടറി?
ഒരു എറർ ബൗണ്ടറി എന്നത് ഒരു റിയാക്ട് കമ്പോണൻ്റാണ്, അത് അതിൻ്റെ ചൈൽഡ് കമ്പോണൻ്റ് ട്രീയിൽ എവിടെയും സംഭവിക്കുന്ന ജാവാസ്ക്രിപ്റ്റ് പിശകുകൾ കണ്ടെത്തുകയും, ആ പിശകുകൾ ലോഗ് ചെയ്യുകയും, ക്രാഷ് ആയ കമ്പോണൻ്റ് ട്രീക്ക് പകരം ഒരു ഫാൾബാക്ക് യുഐ കാണിക്കുകയും ചെയ്യുന്നു. റെൻഡറിംഗ് സമയത്തും, ലൈഫ്സൈക്കിൾ മെത്തേഡുകളിലും, അതിന് താഴെയുള്ള മുഴുവൻ ട്രീയുടെയും കൺസ്ട്രക്ടറുകളിലും ഉണ്ടാകുന്ന പിശകുകൾ എറർ ബൗണ്ടറികൾ കണ്ടെത്തുന്നു.
റിയാക്ട് കമ്പോണൻ്റുകൾക്കുള്ള ഒരു try...catch
ബ്ലോക്കായി എറർ ബൗണ്ടറിയെ കരുതുക. സിൻക്രണസ് ജാവാസ്ക്രിപ്റ്റ് കോഡിലെ എക്സെപ്ഷനുകൾ കൈകാര്യം ചെയ്യാൻ ഒരു try...catch
ബ്ലോക്ക് നിങ്ങളെ അനുവദിക്കുന്നതുപോലെ, നിങ്ങളുടെ റിയാക്ട് കമ്പോണൻ്റുകളുടെ റെൻഡറിംഗ് സമയത്ത് സംഭവിക്കുന്ന പിശകുകൾ കൈകാര്യം ചെയ്യാൻ ഒരു എറർ ബൗണ്ടറി നിങ്ങളെ അനുവദിക്കുന്നു.
പ്രധാന കുറിപ്പ്: എറർ ബൗണ്ടറികൾ താഴെ പറയുന്നവയ്ക്കുള്ള പിശകുകൾ കണ്ടെത്തുകയില്ല:
- ഇവൻ്റ് ഹാൻഡ്ലറുകൾ (അടുത്ത ഭാഗങ്ങളിൽ കൂടുതൽ പഠിക്കാം)
- അസിൻക്രണസ് കോഡ് (ഉദാ.
setTimeout
അല്ലെങ്കിൽrequestAnimationFrame
കോൾബാക്കുകൾ) - സെർവർ-സൈഡ് റെൻഡറിംഗ്
- എറർ ബൗണ്ടറിയിൽ തന്നെ (അതിൻ്റെ ചിൽഡ്രനിലല്ലാതെ) ഉണ്ടാകുന്ന പിശകുകൾ
എന്തുകൊണ്ട് എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കണം?
എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കുന്നത് നിരവധി പ്രധാന നേട്ടങ്ങൾ നൽകുന്നു:
- മെച്ചപ്പെട്ട ഉപയോക്തൃ അനുഭവം: ഒരു ഒഴിഞ്ഞ വെളുത്ത സ്ക്രീനോ അല്ലെങ്കിൽ മനസ്സിലാക്കാൻ പ്രയാസമുള്ള പിശക് സന്ദേശമോ കാണിക്കുന്നതിന് പകരം, നിങ്ങൾക്ക് ഉപയോക്താവിന് മനസ്സിലാകുന്ന ഒരു ഫാൾബാക്ക് യുഐ കാണിക്കാം. എന്തോ കുഴപ്പം സംഭവിച്ചുവെന്ന് ഉപയോക്താവിനെ അറിയിക്കുകയും, ഒരുപക്ഷേ അത് പരിഹരിക്കാനുള്ള ഒരു മാർഗ്ഗം (ഉദാഹരണത്തിന്, പേജ് റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ മറ്റൊരു ഭാഗത്തേക്ക് പോകുക) നൽകുകയും ചെയ്യാം.
- ആപ്ലിക്കേഷൻ്റെ സ്ഥിരത: നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ ഒരു ഭാഗത്തെ പിശകുകൾ മുഴുവൻ ആപ്ലിക്കേഷനെയും ക്രാഷ് ചെയ്യുന്നതിൽ നിന്ന് എറർ ബൗണ്ടറികൾ തടയുന്നു. പരസ്പരം ബന്ധപ്പെട്ടിരിക്കുന്ന നിരവധി കമ്പോണൻ്റുകളുള്ള സങ്കീർണ്ണമായ ആപ്ലിക്കേഷനുകൾക്ക് ഇത് വളരെ പ്രധാനമാണ്.
- കേന്ദ്രീകൃത പിശക് കൈകാര്യം ചെയ്യൽ: പിശകുകൾ ലോഗ് ചെയ്യാനും പ്രശ്നങ്ങളുടെ മൂലകാരണം കണ്ടെത്താനും എറർ ബൗണ്ടറികൾ ഒരു കേന്ദ്രീകൃത സ്ഥലം നൽകുന്നു. ഇത് ഡീബഗ്ഗിംഗും മെയിൻ്റനൻസും ലളിതമാക്കുന്നു.
- ഗ്രേസ്ഫുൾ ഡിഗ്രഡേഷൻ: ചില കമ്പോണൻ്റുകൾ പരാജയപ്പെട്ടാലും ആപ്ലിക്കേഷൻ്റെ ബാക്കി ഭാഗങ്ങൾ പ്രവർത്തനക്ഷമമായി തുടരുന്നുവെന്ന് ഉറപ്പാക്കാൻ നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ വിവിധ ഭാഗങ്ങളിൽ എറർ ബൗണ്ടറികൾ തന്ത്രപരമായി സ്ഥാപിക്കാം. ഇത് പിശകുകളുടെ മുന്നിൽ ഗ്രേസ്ഫുൾ ഡിഗ്രഡേഷന് അനുവദിക്കുന്നു.
റിയാക്ടിൽ എറർ ബൗണ്ടറികൾ നടപ്പിലാക്കൽ
ഒരു എറർ ബൗണ്ടറി ഉണ്ടാക്കുന്നതിന്, താഴെ പറയുന്ന ലൈഫ്സൈക്കിൾ മെത്തേഡുകളിൽ ഏതെങ്കിലും ഒന്ന് (അല്ലെങ്കിൽ രണ്ടും) നടപ്പിലാക്കുന്ന ഒരു ക്ലാസ് കമ്പോണൻ്റ് നിങ്ങൾ നിർവചിക്കേണ്ടതുണ്ട്:
static getDerivedStateFromError(error)
: ഒരു ഡിസൻഡൻ്റ് കമ്പോണൻ്റ് ഒരു പിശക് ത്രോ ചെയ്തതിന് ശേഷം ഈ ലൈഫ്സൈക്കിൾ മെത്തേഡ് വിളിക്കപ്പെടുന്നു. ത്രോ ചെയ്യപ്പെട്ട പിശക് ഒരു ആർഗ്യുമെൻ്റായി ഇതിന് ലഭിക്കുന്നു, കൂടാതെ ഒരു പിശക് സംഭവിച്ചുവെന്ന് സൂചിപ്പിക്കുന്നതിന് കമ്പോണൻ്റിൻ്റെ സ്റ്റേറ്റ് അപ്ഡേറ്റ് ചെയ്യുന്നതിനുള്ള ഒരു മൂല്യം തിരികെ നൽകണം (ഉദാ.hasError
ഫ്ലാഗ്true
ആയി സജ്ജീകരിക്കുന്നത്).componentDidCatch(error, info)
: ഒരു ഡിസൻഡൻ്റ് കമ്പോണൻ്റ് ഒരു പിശക് ത്രോ ചെയ്തതിന് ശേഷം ഈ ലൈഫ്സൈക്കിൾ മെത്തേഡ് വിളിക്കപ്പെടുന്നു. ത്രോ ചെയ്യപ്പെട്ട പിശക് ഒരു ആർഗ്യുമെൻ്റായി ഇതിന് ലഭിക്കുന്നു, അതോടൊപ്പം ഏത് കമ്പോണൻ്റാണ് പിശക് ത്രോ ചെയ്തതെന്നതിനെക്കുറിച്ചുള്ള വിവരങ്ങളടങ്ങിയ ഒരുinfo
ഒബ്ജക്റ്റും ലഭിക്കുന്നു. സെൻട്രി അല്ലെങ്കിൽ ബഗ്സ്നാഗ് പോലുള്ള ഒരു സേവനത്തിലേക്ക് പിശക് ലോഗ് ചെയ്യാൻ നിങ്ങൾക്ക് ഈ മെത്തേഡ് ഉപയോഗിക്കാം.
ഒരു എറർ ബൗണ്ടറി കമ്പോണൻ്റിൻ്റെ അടിസ്ഥാന ഉദാഹരണം ഇതാ:
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, info) {
// ഉദാഹരണം "componentStack":
// in ComponentThatThrows (created by App)
// in MyErrorBoundary (created by App)
// in div (created by App)
// in App
console.error("Caught an error:", error, info);
this.setState({
errorInfo: info.componentStack
});
// നിങ്ങൾക്ക് ഒരു എറർ റിപ്പോർട്ടിംഗ് സേവനത്തിലേക്ക് എറർ ലോഗ് ചെയ്യാനും കഴിയും
//logErrorToMyService(error, info.componentStack);
}
render() {
if (this.state.hasError) {
// നിങ്ങൾക്ക് ഇഷ്ടമുള്ള ഫാൾബാക്ക് യുഐ റെൻഡർ ചെയ്യാം
return (
<div>
<h2>എന്തോ കുഴപ്പം സംഭവിച്ചു.</h2>
<p>പിശക്: {this.state.error ? this.state.error.message : "അജ്ഞാതമായ ഒരു പിശക് സംഭവിച്ചു."}</p>
<details style={{ whiteSpace: 'pre-wrap' }}>
{this.state.errorInfo && this.state.errorInfo}
</details>
</div>
);
}
return this.props.children;
}
}
എറർ ബൗണ്ടറി ഉപയോഗിക്കുന്നതിന്, നിങ്ങൾ സംരക്ഷിക്കാൻ ആഗ്രഹിക്കുന്ന കമ്പോണൻ്റ് ട്രീയെ അതിൽ പൊതിയുക:
<ErrorBoundary>
<MyComponentThatMightThrow/>
</ErrorBoundary>
എറർ ബൗണ്ടറി ഉപയോഗത്തിൻ്റെ പ്രായോഗിക ഉദാഹരണങ്ങൾ
എറർ ബൗണ്ടറികൾ പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാകുന്ന ചില പ്രായോഗിക സാഹചര്യങ്ങൾ നമുക്ക് പരിശോധിക്കാം:
1. എപിഐ പിശകുകൾ കൈകാര്യം ചെയ്യൽ
ഒരു എപിഐയിൽ നിന്ന് ഡാറ്റ ലഭ്യമാക്കുമ്പോൾ, നെറ്റ്വർക്ക് പ്രശ്നങ്ങൾ, സെർവർ പ്രശ്നങ്ങൾ, അല്ലെങ്കിൽ അസാധുവായ ഡാറ്റ എന്നിവ കാരണം പിശകുകൾ സംഭവിക്കാം. ഈ പിശകുകൾ ഭംഗിയായി കൈകാര്യം ചെയ്യാൻ, ഡാറ്റ ലഭ്യമാക്കുകയും പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്ന കമ്പോണൻ്റിനെ ഒരു എറർ ബൗണ്ടറി ഉപയോഗിച്ച് പൊതിയാവുന്നതാണ്.
function UserProfile() {
const [user, setUser] = React.useState(null);
const [isLoading, setIsLoading] = React.useState(true);
React.useEffect(() => {
async function fetchData() {
try {
const response = await fetch('/api/user');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (error) {
// എറർ ബൗണ്ടറി പിശക് പിടിച്ചെടുക്കും
throw error;
} finally {
setIsLoading(false);
}
}
fetchData();
}, []);
if (isLoading) {
return <p>ഉപയോക്തൃ പ്രൊഫൈൽ ലോഡ് ചെയ്യുന്നു...</p>;
}
if (!user) {
return <p>ഉപയോക്തൃ ഡാറ്റ ലഭ്യമല്ല.</p>;
}
return (
<div>
<h2>{user.name}</h2>
<p>ഇമെയിൽ: {user.email}</p>
</div>
);
}
function App() {
return (
<ErrorBoundary>
<UserProfile />
</ErrorBoundary>
);
}
ഈ ഉദാഹരണത്തിൽ, എപിഐ കോൾ പരാജയപ്പെടുകയോ പിശക് നൽകുകയോ ചെയ്താൽ, എറർ ബൗണ്ടറി പിശക് പിടിച്ചെടുക്കുകയും ഒരു ഫാൾബാക്ക് യുഐ (എറർ ബൗണ്ടറിയുടെ render
മെത്തേഡിനുള്ളിൽ നിർവചിച്ചിരിക്കുന്നത്) പ്രദർശിപ്പിക്കുകയും ചെയ്യും. ഇത് മുഴുവൻ ആപ്ലിക്കേഷനും ക്രാഷ് ആകുന്നത് തടയുകയും ഉപയോക്താവിന് കൂടുതൽ വിവരദായകമായ സന്ദേശം നൽകുകയും ചെയ്യുന്നു. അഭ്യർത്ഥന വീണ്ടും ശ്രമിക്കുന്നതിനുള്ള ഒരു ഓപ്ഷൻ നൽകാൻ ഫാൾബാക്ക് യുഐ വികസിപ്പിക്കാവുന്നതാണ്.
2. തേർഡ്-പാർട്ടി ലൈബ്രറി പിശകുകൾ കൈകാര്യം ചെയ്യൽ
തേർഡ്-പാർട്ടി ലൈബ്രറികൾ ഉപയോഗിക്കുമ്പോൾ, അവ അപ്രതീക്ഷിതമായ പിശകുകൾ ത്രോ ചെയ്യാൻ സാധ്യതയുണ്ട്. ഈ ലൈബ്രറികൾ ഉപയോഗിക്കുന്ന കമ്പോണൻ്റുകളെ എറർ ബൗണ്ടറികൾ ഉപയോഗിച്ച് പൊതിയുന്നത് ഈ പിശകുകൾ ഭംഗിയായി കൈകാര്യം ചെയ്യാൻ സഹായിക്കും.
ഡാറ്റയിലെ പൊരുത്തക്കേടുകൾ അല്ലെങ്കിൽ മറ്റ് പ്രശ്നങ്ങൾ കാരണം ഇടയ്ക്കിടെ പിശകുകൾ ത്രോ ചെയ്യുന്ന ഒരു സാങ്കൽപ്പിക ചാർട്ടിംഗ് ലൈബ്രറി പരിഗണിക്കുക. നിങ്ങൾക്ക് ചാർട്ടിംഗ് കമ്പോണൻ്റിനെ ഇതുപോലെ പൊതിയാവുന്നതാണ്:
function MyChartComponent() {
try {
// തേർഡ്-പാർട്ടി ലൈബ്രറി ഉപയോഗിച്ച് ചാർട്ട് റെൻഡർ ചെയ്യുക
return <Chart data={data} />;
} catch (error) {
// റിയാക്ട് കമ്പോണൻ്റ് ലൈഫ് സൈക്കിൾ പിശകുകൾക്ക് ഈ ക്യാച്ച് ബ്ലോക്ക് ഫലപ്രദമാകില്ല
// ഇത് പ്രധാനമായും ഈ നിർദ്ദിഷ്ട ഫംഗ്ഷനിലെ സിൻക്രണസ് പിശകുകൾക്കാണ്.
console.error("ചാർട്ട് റെൻഡർ ചെയ്യുന്നതിൽ പിശക്:", error);
// എറർ ബൗണ്ടറി പിടിച്ചെടുക്കുന്നതിനായി പിശക് ത്രോ ചെയ്യുന്നത് പരിഗണിക്കുക
throw error; // പിശക് വീണ്ടും ത്രോ ചെയ്യുന്നു
}
}
function App() {
return (
<ErrorBoundary>
<MyChartComponent />
</ErrorBoundary>
);
}
Chart
കമ്പോണൻ്റ് ഒരു പിശക് ത്രോ ചെയ്താൽ, എറർ ബൗണ്ടറി അത് പിടിച്ചെടുക്കുകയും ഒരു ഫാൾബാക്ക് യുഐ പ്രദർശിപ്പിക്കുകയും ചെയ്യും. MyChartComponent-ലെ try/catch സിൻക്രണസ് ഫംഗ്ഷനിലെ പിശകുകൾ മാത്രമേ പിടിച്ചെടുക്കുകയുള്ളൂ, കമ്പോണൻ്റിൻ്റെ ലൈഫ് സൈക്കിളിലെ പിശകുകൾ പിടിച്ചെടുക്കില്ല. അതിനാൽ, എറർ ബൗണ്ടറി ഇവിടെ നിർണ്ണായകമാണ്.
3. റെൻഡറിംഗ് പിശകുകൾ കൈകാര്യം ചെയ്യൽ
അസാധുവായ ഡാറ്റ, തെറ്റായ പ്രോപ്പ് ടൈപ്പുകൾ, അല്ലെങ്കിൽ മറ്റ് പ്രശ്നങ്ങൾ എന്നിവ കാരണം റെൻഡറിംഗ് പ്രക്രിയയിൽ പിശകുകൾ സംഭവിക്കാം. എറർ ബൗണ്ടറികൾക്ക് ഈ പിശകുകൾ പിടിച്ചെടുക്കാനും ആപ്ലിക്കേഷൻ ക്രാഷ് ആകുന്നത് തടയാനും കഴിയും.
function DisplayName({ name }) {
if (typeof name !== 'string') {
throw new Error('പേര് ഒരു സ്ട്രിംഗ് ആയിരിക്കണം');
}
return <h2>ഹലോ, {name}!</h2>;
}
function App() {
return (
<ErrorBoundary>
<DisplayName name={123} /> <!-- തെറ്റായ പ്രോപ്പ് ടൈപ്പ് -->
</ErrorBoundary>
);
}
ഈ ഉദാഹരണത്തിൽ, DisplayName
കമ്പോണൻ്റ് name
പ്രോപ്പ് ഒരു സ്ട്രിംഗ് ആയിരിക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു. പകരം ഒരു നമ്പർ നൽകിയാൽ, ഒരു പിശക് ത്രോ ചെയ്യപ്പെടുകയും എറർ ബൗണ്ടറി അത് പിടിച്ചെടുത്ത് ഒരു ഫാൾബാക്ക് യുഐ പ്രദർശിപ്പിക്കുകയും ചെയ്യും.
എറർ ബൗണ്ടറികളും ഇവൻ്റ് ഹാൻഡ്ലറുകളും
നേരത്തെ സൂചിപ്പിച്ചതുപോലെ, ഇവൻ്റ് ഹാൻഡ്ലറുകളിൽ സംഭവിക്കുന്ന പിശകുകൾ എറർ ബൗണ്ടറികൾ പിടിച്ചെടുക്കില്ല. കാരണം, ഇവൻ്റ് ഹാൻഡ്ലറുകൾ സാധാരണയായി അസിൻക്രണസ് ആണ്, കൂടാതെ റെൻഡറിംഗ് സമയത്തും, ലൈഫ് സൈക്കിൾ മെത്തേഡുകളിലും, കൺസ്ട്രക്ടറുകളിലും സംഭവിക്കുന്ന പിശകുകൾ മാത്രമേ എറർ ബൗണ്ടറികൾ പിടിച്ചെടുക്കൂ.
ഇവൻ്റ് ഹാൻഡ്ലറുകളിലെ പിശകുകൾ കൈകാര്യം ചെയ്യാൻ, നിങ്ങൾ ഇവൻ്റ് ഹാൻഡ്ലർ ഫംഗ്ഷനിൽ ഒരു പരമ്പരാഗത try...catch
ബ്ലോക്ക് ഉപയോഗിക്കേണ്ടതുണ്ട്.
function MyComponent() {
const handleClick = () => {
try {
// പിശക് ത്രോ ചെയ്യാൻ സാധ്യതയുള്ള ചില കോഡ്
throw new Error('ഇവൻ്റ് ഹാൻഡ്ലറിൽ ഒരു പിശക് സംഭവിച്ചു');
} catch (error) {
console.error('ഇവൻ്റ് ഹാൻഡ്ലറിൽ ഒരു പിശക് പിടിച്ചെടുത്തു:', error);
// പിശക് കൈകാര്യം ചെയ്യുക (ഉദാ. ഉപയോക്താവിന് ഒരു പിശക് സന്ദേശം പ്രദർശിപ്പിക്കുക)
}
};
return <button onClick={handleClick}>ഇവിടെ ക്ലിക്ക് ചെയ്യുക</button>;
}
ഗ്ലോബൽ എറർ ഹാൻഡ്ലിംഗ്
റിയാക്ട് കമ്പോണൻ്റ് ട്രീയിലെ പിശകുകൾ കൈകാര്യം ചെയ്യാൻ എറർ ബൗണ്ടറികൾ മികച്ചതാണെങ്കിലും, സാധ്യമായ എല്ലാ പിശക് സാഹചര്യങ്ങളും അവ ഉൾക്കൊള്ളുന്നില്ല. ഉദാഹരണത്തിന്, റിയാക്ട് കമ്പോണൻ്റുകൾക്ക് പുറത്ത് സംഭവിക്കുന്ന പിശകുകൾ, അതായത് ഗ്ലോബൽ ഇവൻ്റ് ലിസണറുകളിലെ പിശകുകൾ അല്ലെങ്കിൽ റിയാക്ട് ഇനിഷ്യലൈസ് ചെയ്യുന്നതിന് മുമ്പ് പ്രവർത്തിക്കുന്ന കോഡിലെ പിശകുകൾ അവ പിടിച്ചെടുക്കുന്നില്ല.
ഇത്തരത്തിലുള്ള പിശകുകൾ കൈകാര്യം ചെയ്യാൻ, നിങ്ങൾക്ക് window.onerror
ഇവൻ്റ് ഹാൻഡ്ലർ ഉപയോഗിക്കാം.
window.onerror = function(message, source, lineno, colno, error) {
console.error('ഗ്ലോബൽ എറർ ഹാൻഡ്ലർ:', message, source, lineno, colno, error);
// സെൻട്രി അല്ലെങ്കിൽ ബഗ്സ്നാഗ് പോലുള്ള ഒരു സേവനത്തിലേക്ക് പിശക് ലോഗ് ചെയ്യുക
// ഉപയോക്താവിന് ഒരു ഗ്ലോബൽ പിശക് സന്ദേശം പ്രദർശിപ്പിക്കുക (ഓപ്ഷണൽ)
return true; // സ്ഥിരസ്ഥിതി പിശക് കൈകാര്യം ചെയ്യൽ സ്വഭാവം തടയുക
};
പിടികിട്ടാത്ത ഒരു ജാവാസ്ക്രിപ്റ്റ് പിശക് സംഭവിക്കുമ്പോഴെല്ലാം window.onerror
ഇവൻ്റ് ഹാൻഡ്ലർ വിളിക്കപ്പെടുന്നു. നിങ്ങൾക്ക് ഇത് പിശക് ലോഗ് ചെയ്യാനോ, ഉപയോക്താവിന് ഒരു ഗ്ലോബൽ പിശക് സന്ദേശം പ്രദർശിപ്പിക്കാനോ, അല്ലെങ്കിൽ പിശക് കൈകാര്യം ചെയ്യാൻ മറ്റ് നടപടികൾ സ്വീകരിക്കാനോ ഉപയോഗിക്കാം.
പ്രധാനം: window.onerror
ഇവൻ്റ് ഹാൻഡ്ലറിൽ നിന്ന് true
തിരികെ നൽകുന്നത് ബ്രൗസറിനെ സ്ഥിരസ്ഥിതി പിശക് സന്ദേശം പ്രദർശിപ്പിക്കുന്നതിൽ നിന്ന് തടയുന്നു. എന്നിരുന്നാലും, ഉപയോക്തൃ അനുഭവത്തെക്കുറിച്ച് ശ്രദ്ധാലുവായിരിക്കുക; നിങ്ങൾ സ്ഥിരസ്ഥിതി സന്ദേശം അടിച്ചമർത്തുകയാണെങ്കിൽ, നിങ്ങൾ വ്യക്തവും വിവരദായകവുമായ ഒരു ബദൽ നൽകുന്നുവെന്ന് ഉറപ്പാക്കുക.
എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കുന്നതിനുള്ള മികച്ച രീതികൾ
എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കുമ്പോൾ മനസ്സിൽ സൂക്ഷിക്കേണ്ട ചില മികച്ച രീതികൾ ഇതാ:
- തന്ത്രപരമായി എറർ ബൗണ്ടറികൾ സ്ഥാപിക്കുക: പിശകുകൾ വേർതിരിക്കാനും അവ പടരുന്നത് തടയാനും നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ വിവിധ ഭാഗങ്ങളെ എറർ ബൗണ്ടറികൾ ഉപയോഗിച്ച് പൊതിയുക. മുഴുവൻ റൂട്ടുകളെയോ അല്ലെങ്കിൽ നിങ്ങളുടെ യുഐയുടെ പ്രധാന ഭാഗങ്ങളെയോ പൊതിയുന്നത് പരിഗണിക്കുക.
- വിവരദായകമായ ഫാൾബാക്ക് യുഐ നൽകുക: ഫാൾബാക്ക് യുഐ ഒരു പിശക് സംഭവിച്ചുവെന്ന് ഉപയോക്താവിനെ അറിയിക്കുകയും വീണ്ടെടുക്കാനുള്ള ഒരു മാർഗ്ഗം വാഗ്ദാനം ചെയ്യുകയും വേണം. "എന്തോ കുഴപ്പം സംഭവിച്ചു" പോലുള്ള പൊതുവായ പിശക് സന്ദേശങ്ങൾ പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കുക.
- പിശകുകൾ ലോഗ് ചെയ്യുക: സെൻട്രി അല്ലെങ്കിൽ ബഗ്സ്നാഗ് പോലുള്ള ഒരു സേവനത്തിലേക്ക് പിശകുകൾ ലോഗ് ചെയ്യാൻ
componentDidCatch
ലൈഫ് സൈക്കിൾ മെത്തേഡ് ഉപയോഗിക്കുക. ഇത് പ്രശ്നങ്ങളുടെ മൂലകാരണം കണ്ടെത്താനും നിങ്ങളുടെ ആപ്ലിക്കേഷൻ്റെ സ്ഥിരത മെച്ചപ്പെടുത്താനും സഹായിക്കും. - പ്രതീക്ഷിക്കുന്ന പിശകുകൾക്ക് എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കരുത്: അപ്രതീക്ഷിത പിശകുകൾ കൈകാര്യം ചെയ്യാനാണ് എറർ ബൗണ്ടറികൾ രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്. പ്രതീക്ഷിക്കുന്ന പിശകുകൾക്ക് (ഉദാ. വാലിഡേഷൻ പിശകുകൾ, എപിഐ പിശകുകൾ),
try...catch
ബ്ലോക്കുകൾ അല്ലെങ്കിൽ കസ്റ്റം എറർ ഹാൻഡ്ലിംഗ് കമ്പോണൻ്റുകൾ പോലുള്ള കൂടുതൽ നിർദ്ദിഷ്ട പിശക് കൈകാര്യം ചെയ്യൽ സംവിധാനങ്ങൾ ഉപയോഗിക്കുക. - എറർ ബൗണ്ടറികളുടെ ഒന്നിലധികം തലങ്ങൾ പരിഗണിക്കുക: വിവിധ തലങ്ങളിലുള്ള പിശക് കൈകാര്യം ചെയ്യൽ നൽകാൻ നിങ്ങൾക്ക് എറർ ബൗണ്ടറികൾ നെസ്റ്റ് ചെയ്യാം. ഉദാഹരണത്തിന്, കൈകാര്യം ചെയ്യാത്ത ഏതെങ്കിലും പിശകുകൾ പിടിച്ചെടുക്കുകയും ഒരു പൊതുവായ പിശക് സന്ദേശം പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്ന ഒരു ഗ്ലോബൽ എറർ ബൗണ്ടറിയും, പ്രത്യേക കമ്പോണൻ്റുകളിലെ പിശകുകൾ പിടിച്ചെടുക്കുകയും കൂടുതൽ വിശദമായ പിശക് സന്ദേശങ്ങൾ പ്രദർശിപ്പിക്കുകയും ചെയ്യുന്ന കൂടുതൽ നിർദ്ദിഷ്ട എറർ ബൗണ്ടറികളും നിങ്ങൾക്ക് ഉണ്ടാകാം.
- സെർവർ-സൈഡ് റെൻഡറിംഗിനെക്കുറിച്ച് മറക്കരുത്: നിങ്ങൾ സെർവർ-സൈഡ് റെൻഡറിംഗ് ഉപയോഗിക്കുകയാണെങ്കിൽ, നിങ്ങൾ സെർവറിലും പിശകുകൾ കൈകാര്യം ചെയ്യേണ്ടതുണ്ട്. എറർ ബൗണ്ടറികൾ സെർവറിൽ പ്രവർത്തിക്കുന്നു, പക്ഷേ പ്രാരംഭ റെൻഡറിംഗ് സമയത്ത് സംഭവിക്കുന്ന പിശകുകൾ പിടിച്ചെടുക്കാൻ നിങ്ങൾക്ക് അധിക പിശക് കൈകാര്യം ചെയ്യൽ സംവിധാനങ്ങൾ ഉപയോഗിക്കേണ്ടി വന്നേക്കാം.
അഡ്വാൻസ്ഡ് എറർ ബൗണ്ടറി ടെക്നിക്കുകൾ
1. ഒരു റെൻഡർ പ്രോപ്പ് ഉപയോഗിക്കൽ
ഒരു സ്റ്റാറ്റിക് ഫാൾബാക്ക് യുഐ റെൻഡർ ചെയ്യുന്നതിനുപകരം, പിശകുകൾ എങ്ങനെ കൈകാര്യം ചെയ്യപ്പെടുന്നു എന്നതിൽ കൂടുതൽ വഴക്കം നൽകാൻ നിങ്ങൾക്ക് ഒരു റെൻഡർ പ്രോപ്പ് ഉപയോഗിക്കാം. ഒരു റെൻഡർ പ്രോപ്പ് എന്നത് ഒരു കമ്പോണൻ്റ് എന്തെങ്കിലും റെൻഡർ ചെയ്യാൻ ഉപയോഗിക്കുന്ന ഒരു ഫംഗ്ഷൻ പ്രോപ്പാണ്.
class ErrorBoundary extends React.Component {
// ... (മുമ്പത്തെപ്പോലെ തന്നെ)
render() {
if (this.state.hasError) {
// ഫാൾബാക്ക് യുഐ റെൻഡർ ചെയ്യാൻ റെൻഡർ പ്രോപ്പ് ഉപയോഗിക്കുക
return this.props.fallbackRender(this.state.error, this.state.errorInfo);
}
return this.props.children;
}
}
function App() {
return (
<ErrorBoundary fallbackRender={(error, errorInfo) => (
<div>
<h2>എന്തോ കുഴപ്പം സംഭവിച്ചു!</h2>
<p>പിശക്: {error.message}</p>
<details style={{ whiteSpace: 'pre-wrap' }}>
{errorInfo.componentStack}
</details>
</div>
)}>
<MyComponentThatMightThrow/>
</ErrorBoundary>
);
}
ഇത് ഓരോ എറർ ബൗണ്ടറി അടിസ്ഥാനത്തിലും ഫാൾബാക്ക് യുഐ കസ്റ്റമൈസ് ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. fallbackRender
പ്രോപ്പിന് പിശകും പിശകിൻ്റെ വിവരങ്ങളും ആർഗ്യുമെൻ്റായി ലഭിക്കുന്നു, ഇത് കൂടുതൽ നിർദ്ദിഷ്ട പിശക് സന്ദേശങ്ങൾ പ്രദർശിപ്പിക്കാനോ പിശകിനെ അടിസ്ഥാനമാക്കി മറ്റ് നടപടികൾ സ്വീകരിക്കാനോ നിങ്ങളെ അനുവദിക്കുന്നു.
2. ഒരു ഹയർ-ഓർഡർ കമ്പോണൻ്റ് (HOC) ആയി എറർ ബൗണ്ടറി
മറ്റൊരു കമ്പോണൻ്റിനെ ഒരു എറർ ബൗണ്ടറി ഉപയോഗിച്ച് പൊതിയുന്ന ഒരു ഹയർ-ഓർഡർ കമ്പോണൻ്റ് (HOC) നിങ്ങൾക്ക് സൃഷ്ടിക്കാൻ കഴിയും. ഒരേ കോഡ് ആവർത്തിക്കാതെ ഒന്നിലധികം കമ്പോണൻ്റുകളിൽ എറർ ബൗണ്ടറികൾ പ്രയോഗിക്കുന്നതിന് ഇത് ഉപയോഗപ്രദമാകും.
function withErrorBoundary(WrappedComponent) {
return class WithErrorBoundary extends React.Component {
render() {
return (
<ErrorBoundary>
<WrappedComponent {...this.props} />
</ErrorBoundary>
);
}
};
}
// ഉപയോഗം:
const MyComponentWithErrorHandling = withErrorBoundary(MyComponentThatMightThrow);
withErrorBoundary
ഫംഗ്ഷൻ ഒരു കമ്പോണൻ്റിനെ ആർഗ്യുമെൻ്റായി എടുക്കുകയും യഥാർത്ഥ കമ്പോണൻ്റിനെ ഒരു എറർ ബൗണ്ടറി ഉപയോഗിച്ച് പൊതിയുന്ന ഒരു പുതിയ കമ്പോണൻ്റ് തിരികെ നൽകുകയും ചെയ്യുന്നു. ഇത് നിങ്ങളുടെ ആപ്ലിക്കേഷനിലെ ഏത് കമ്പോണൻ്റിലേക്കും എളുപ്പത്തിൽ എറർ ഹാൻഡ്ലിംഗ് ചേർക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
എറർ ബൗണ്ടറികൾ ടെസ്റ്റ് ചെയ്യൽ
നിങ്ങളുടെ എറർ ബൗണ്ടറികൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കാൻ അവയെ ടെസ്റ്റ് ചെയ്യേണ്ടത് പ്രധാനമാണ്. നിങ്ങളുടെ എറർ ബൗണ്ടറികൾ ടെസ്റ്റ് ചെയ്യാൻ ജെസ്റ്റ്, റിയാക്ട് ടെസ്റ്റിംഗ് ലൈബ്രറി പോലുള്ള ടെസ്റ്റിംഗ് ലൈബ്രറികൾ ഉപയോഗിക്കാം.
റിയാക്ട് ടെസ്റ്റിംഗ് ലൈബ്രറി ഉപയോഗിച്ച് ഒരു എറർ ബൗണ്ടറി എങ്ങനെ ടെസ്റ്റ് ചെയ്യാം എന്നതിൻ്റെ ഒരു ഉദാഹരണം ഇതാ:
import { render, screen, fireEvent } from '@testing-library/react';
import ErrorBoundary from './ErrorBoundary';
function ComponentThatThrows() {
throw new Error('ഈ കമ്പോണൻ്റ് ഒരു പിശക് ത്രോ ചെയ്യുന്നു');
}
test('ഒരു പിശക് ത്രോ ചെയ്യുമ്പോൾ ഫാൾബാക്ക് യുഐ റെൻഡർ ചെയ്യുന്നു', () => {
render(
<ErrorBoundary>
<ComponentThatThrows />
</ErrorBoundary>
);
expect(screen.getByText('എന്തോ കുഴപ്പം സംഭവിച്ചു.')).toBeInTheDocument();
});
ഈ ടെസ്റ്റ് ComponentThatThrows
കമ്പോണൻ്റിനെ റെൻഡർ ചെയ്യുന്നു, അത് ഒരു പിശക് ത്രോ ചെയ്യുന്നു. തുടർന്ന്, എറർ ബൗണ്ടറി റെൻഡർ ചെയ്ത ഫാൾബാക്ക് യുഐ പ്രദർശിപ്പിച്ചിട്ടുണ്ടെന്ന് ടെസ്റ്റ് ഉറപ്പുവരുത്തുന്നു.
എറർ ബൗണ്ടറികളും സെർവർ കമ്പോണൻ്റുകളും (റിയാക്ട് 18+)
റിയാക്ട് 18-ലും അതിനുശേഷമുള്ള പതിപ്പുകളിലും സെർവർ കമ്പോണൻ്റുകളുടെ വരവോടെ, എറർ ബൗണ്ടറികൾ എറർ ഹാൻഡ്ലിംഗിൽ ഒരു പ്രധാന പങ്ക് വഹിക്കുന്നത് തുടരുന്നു. സെർവർ കമ്പോണൻ്റുകൾ സെർവറിൽ പ്രവർത്തിക്കുകയും റെൻഡർ ചെയ്ത ഔട്ട്പുട്ട് മാത്രം ക്ലയിൻ്റിലേക്ക് അയയ്ക്കുകയും ചെയ്യുന്നു. പ്രധാന തത്വങ്ങൾ ഒന്നുതന്നെയാണെങ്കിലും, പരിഗണിക്കേണ്ട ചില സൂക്ഷ്മതകളുണ്ട്:
- സെർവർ-സൈഡ് എറർ ലോഗിംഗ്: സെർവർ കമ്പോണൻ്റുകളിൽ സംഭവിക്കുന്ന പിശകുകൾ നിങ്ങൾ സെർവറിൽ ലോഗ് ചെയ്യുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക. ഇതിനായി ഒരു സെർവർ-സൈഡ് ലോഗിംഗ് ഫ്രെയിംവർക്ക് ഉപയോഗിക്കുകയോ അല്ലെങ്കിൽ പിശകുകൾ ഒരു എറർ ട്രാക്കിംഗ് സേവനത്തിലേക്ക് അയയ്ക്കുകയോ ചെയ്യേണ്ടി വന്നേക്കാം.
- ക്ലയിൻ്റ്-സൈഡ് ഫാൾബാക്ക്: സെർവർ കമ്പോണൻ്റുകൾ സെർവറിൽ റെൻഡർ ചെയ്യുന്നുണ്ടെങ്കിലും, പിശകുകൾ ഉണ്ടായാൽ നിങ്ങൾ ഒരു ക്ലയിൻ്റ്-സൈഡ് ഫാൾബാക്ക് യുഐ നൽകേണ്ടതുണ്ട്. സെർവർ കമ്പോണൻ്റ് റെൻഡർ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടാലും ഉപയോക്താവിന് ഒരു സ്ഥിരമായ അനുഭവം ഇത് ഉറപ്പാക്കുന്നു.
- സ്ട്രീമിംഗ് SSR: സ്ട്രീമിംഗ് സെർവർ-സൈഡ് റെൻഡറിംഗ് (SSR) ഉപയോഗിക്കുമ്പോൾ, സ്ട്രീമിംഗ് പ്രക്രിയയിൽ പിശകുകൾ സംഭവിക്കാം. ബാധിച്ച സ്ട്രീമിനായി ഒരു ഫാൾബാക്ക് യുഐ റെൻഡർ ചെയ്തുകൊണ്ട് ഈ പിശകുകൾ ഭംഗിയായി കൈകാര്യം ചെയ്യാൻ എറർ ബൗണ്ടറികൾ നിങ്ങളെ സഹായിക്കും.
സെർവർ കമ്പോണൻ്റുകളിലെ എറർ ഹാൻഡ്ലിംഗ് ഒരു വികസിച്ചുകൊണ്ടിരിക്കുന്ന മേഖലയാണ്, അതിനാൽ ഏറ്റവും പുതിയ മികച്ച രീതികളും ശുപാർശകളും ഉപയോഗിച്ച് അപ്ഡേറ്റായി തുടരേണ്ടത് പ്രധാനമാണ്.
ഒഴിവാക്കേണ്ട സാധാരണ പിഴവുകൾ
- എറർ ബൗണ്ടറികളിലുള്ള അമിതമായ ആശ്രയം: നിങ്ങളുടെ കമ്പോണൻ്റുകളിലെ ശരിയായ എറർ ഹാൻഡ്ലിംഗിന് പകരമായി എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കരുത്. പിശകുകൾ ഭംഗിയായി കൈകാര്യം ചെയ്യുന്ന ശക്തവും വിശ്വസനീയവുമായ കോഡ് എഴുതാൻ എപ്പോഴും ശ്രമിക്കുക.
- പിശകുകൾ അവഗണിക്കൽ: എറർ ബൗണ്ടറികൾ പിടിച്ചെടുക്കുന്ന പിശകുകൾ നിങ്ങൾ ലോഗ് ചെയ്യുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക, അതുവഴി നിങ്ങൾക്ക് പ്രശ്നങ്ങളുടെ മൂലകാരണം കണ്ടെത്താൻ കഴിയും. വെറുതെ ഒരു ഫാൾബാക്ക് യുഐ പ്രദർശിപ്പിച്ച് പിശക് അവഗണിക്കരുത്.
- വാലിഡേഷൻ പിശകുകൾക്ക് എറർ ബൗണ്ടറികൾ ഉപയോഗിക്കൽ: വാലിഡേഷൻ പിശകുകൾ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ശരിയായ ഉപകരണം എറർ ബൗണ്ടറികളല്ല. പകരം കൂടുതൽ നിർദ്ദിഷ്ട വാലിഡേഷൻ ടെക്നിക്കുകൾ ഉപയോഗിക്കുക.
- എറർ ബൗണ്ടറികൾ ടെസ്റ്റ് ചെയ്യാതിരിക്കൽ: നിങ്ങളുടെ എറർ ബൗണ്ടറികൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കാൻ അവയെ ടെസ്റ്റ് ചെയ്യുക.
ഉപസംഹാരം
ശക്തവും വിശ്വസനീയവുമായ റിയാക്ട് ആപ്ലിക്കേഷനുകൾ നിർമ്മിക്കുന്നതിനുള്ള ശക്തമായ ഒരു ഉപകരണമാണ് എറർ ബൗണ്ടറികൾ. എറർ ബൗണ്ടറികൾ എങ്ങനെ ഫലപ്രദമായി നടപ്പിലാക്കാമെന്നും ഉപയോഗിക്കാമെന്നും മനസ്സിലാക്കുന്നതിലൂടെ, നിങ്ങൾക്ക് ഉപയോക്തൃ അനുഭവം മെച്ചപ്പെടുത്താനും, ആപ്ലിക്കേഷൻ ക്രാഷുകൾ തടയാനും, ഡീബഗ്ഗിംഗ് ലളിതമാക്കാനും കഴിയും. എറർ ബൗണ്ടറികൾ തന്ത്രപരമായി സ്ഥാപിക്കാനും, വിവരദായകമായ ഫാൾബാക്ക് യുഐ നൽകാനും, പിശകുകൾ ലോഗ് ചെയ്യാനും, നിങ്ങളുടെ എറർ ബൗണ്ടറികൾ സമഗ്രമായി ടെസ്റ്റ് ചെയ്യാനും ഓർമ്മിക്കുക.
ഈ ഗൈഡിൽ പറഞ്ഞിരിക്കുന്ന മാർഗ്ഗനിർദ്ദേശങ്ങളും മികച്ച രീതികളും പാലിക്കുന്നതിലൂടെ, നിങ്ങളുടെ റിയാക്ട് ആപ്ലിക്കേഷനുകൾ പിശകുകളിൽ നിന്ന് സുരക്ഷിതമാണെന്നും ഉപയോക്താക്കൾക്ക് ഒരു നല്ല അനുഭവം നൽകുന്നുവെന്നും ഉറപ്പാക്കാൻ നിങ്ങൾക്ക് കഴിയും.