2020 এপ্রিল আপডেট করুন:
ইস্যুটি 16.13.1 এর সর্বশেষ প্রতিক্রিয়াতে স্থির হয়েছে বলে মনে হচ্ছে, এই স্যান্ডবক্সের উদাহরণটি দেখুন । এটি নির্দেশ করার জন্য @ আবার্নিয়ারকে ধন্যবাদ।
আমি কিছু গবেষণা করেছি এবং আমি একটি গুরুত্বপূর্ণ পার্থক্য খুঁজে পেয়েছি:
প্রতিক্রিয়া অ্যাসিঙ্ক লাইফেসাইক্যাল পদ্ধতিগুলি থেকে ত্রুটিগুলি প্রক্রিয়া করে না।
সুতরাং, আপনি যদি এই জাতীয় কিছু লিখেন:
componentDidMount()
{
throw new Error('I crashed!');
}
তারপরে আপনার ত্রুটিটি ত্রুটি সীমার দ্বারা ধরা পড়বে এবং আপনি এটি প্রক্রিয়া করতে পারেন এবং একটি দুর্দান্ত বার্তা প্রদর্শন করতে পারেন।
যদি আমরা কোডটি এর মতো পরিবর্তন করি:
async componentDidMount()
{
throw new Error('I crashed!');
}
যা এর সমান:
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
তাহলে আপনার ত্রুটি নিঃশব্দে গ্রাস করা হবে । আপনাকে লজ্জা, প্রতিক্রিয়া ...
সুতরাং, আমরা এর চেয়ে ত্রুটিগুলি কীভাবে প্রক্রিয়া করব? একমাত্র উপায় এই মত সুস্পষ্ট ক্যাচ বলে মনে হচ্ছে:
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
বা এই মত:
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
যদি আমরা এখনও আমাদের ত্রুটিটি ত্রুটির সীমানায় পৌঁছাতে চাই তবে আমি নিম্নলিখিত কৌশল সম্পর্কে ভাবতে পারি:
- ত্রুটিটি ধরুন, ত্রুটি হ্যান্ডলারটি উপাদানটির স্থিতি পরিবর্তন করুন
- রাষ্ট্র যদি কোনও ত্রুটি নির্দেশ করে তবে এটিকে
render
পদ্ধতি থেকে ফেলে দিন
উদাহরণ:
class BuggyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
buggyAsyncfunction(){ return Promise.reject(new Error('I crashed async!'));}
async componentDidMount() {
try
{
await this.buggyAsyncfunction();
}
catch(error)
{
this.setState({error: error});
}
}
render() {
if(this.state.error)
throw this.state.error;
return <h1>I am OK</h1>;
}
}