در حال بارگذاری...

مدیریت خطاها

در ری‌اکت (React)، مدیریت خطاها یک بخش اساسی برای ساخت برنامه‌های وب پایدار و قابل اعتماد است. در برنامه‌های مدرن Single Page Applications (SPA) که از کامپوننت‌های متعدد و پیچیده استفاده می‌کنند، خطاهای ناخواسته در هنگام دریافت داده‌ها، بروزرسانی state و تعاملات کاربری امری طبیعی هستند. بدون مدیریت مناسب، این خطاها می‌توانند باعث از کار افتادن کل برنامه یا رفتارهای غیرمنتظره شوند.
ری‌اکت امکاناتی مانند Error Boundaries ارائه می‌دهد که به توسعه‌دهندگان اجازه می‌دهد خطاهای رخ‌داده در کامپوننت‌های فرزند را گرفته و یک رابط کاربری جایگزین نمایش دهند. این قابلیت به جلوگیری از کرش شدن کل اپلیکیشن کمک می‌کند. علاوه بر این، استفاده از بلوک‌های try/catch و متدهای Promise.catch برای مدیریت خطاهای غیرهمزمان توصیه می‌شود.
در این مرجع، شما خواهید آموخت که چگونه کامپوننت‌های حساس به خطا بسازید، Error Boundaries را به‌طور مؤثر پیاده‌سازی کنید، خطاهای غیرهمزمان را مدیریت نمایید و با بهینه‌سازی عملکرد، پایداری برنامه را افزایش دهید. این دانش برای ساخت برنامه‌های ری‌اکت پیچیده و حرفه‌ای ضروری است و به شما کمک می‌کند تا اپلیکیشن‌هایی مقاوم، قابل نگهداری و با تجربه کاربری بهینه ایجاد کنید.

مثال پایه

jsx
JSX Code
import React, { Component, useState } from 'react';

class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}

static getDerivedStateFromError(error) {
return { hasError: true };
}

componentDidCatch(error, info) {
console.error("خطای گرفته‌شده:", error, info);
}

render() {
if (this.state.hasError) {
return <h2>یک خطا در این کامپوننت رخ داده است.</h2>;
}
return this.props.children;
}
}

function FaultyComponent() {
const [count, setCount] = useState(0);

if (count === 3) {
throw new Error("حد شمارش عبور شد!");
}

return ( <div> <p>شمارنده فعلی: {count}</p>
<button onClick={() => setCount(count + 1)}>افزایش</button> </div>
);
}

export default function App() {
return ( <ErrorBoundary> <FaultyComponent /> </ErrorBoundary>
);
}

در این مثال، کامپوننت ErrorBoundary یک کامپوننت کلاس است که خطاهای ایجادشده در کامپوننت‌های فرزند خود را گرفته و از کرش شدن کل اپلیکیشن جلوگیری می‌کند. متد getDerivedStateFromError وضعیت state را هنگام وقوع خطا به‌روزرسانی می‌کند تا رابط کاربری جایگزین نمایش داده شود و متد componentDidCatch خطا و جزئیات کامپوننت را در کنسول لاگ می‌کند تا توسعه‌دهنده بتواند مشکل را بررسی کند.
FaultyComponent یک کامپوننت تابعی ساده است که شمارنده را نگه می‌دارد و در صورت رسیدن به مقدار ۳ یک خطا پرتاب می‌کند. استفاده از useState تضمین می‌کند که state به‌صورت امن مدیریت شود و از تغییر مستقیم state جلوگیری می‌شود. این الگو می‌تواند برای مدیریت خطاهای غیرهمزمان، داده‌های ناهمزمان و کامپوننت‌های تو در تو نیز به کار رود.

مثال کاربردی

jsx
JSX Code
import React, { useState, useEffect } from 'react';

function DataFetcher({ url }) {
const [data, setData] = useState(null);
const [error, setError] = useState(null);

useEffect(() => {
fetch(url)
.then(res => {
if (!res.ok) throw new Error("خطا در دریافت داده‌ها");
return res.json();
})
.then(setData)
.catch(setError);
}, [url]);

if (error) return <div>خطا در بارگذاری: {error.message}</div>;
if (!data) return <div>در حال بارگذاری داده...</div>;

return <pre>{JSON.stringify(data, null, 2)}</pre>;
}

export default function App() {
return <DataFetcher url="https://jsonplaceholder.typicode.com/posts/1" />;
}

Advanced ری‌اکت (React) Implementation

jsx
JSX Code
import React, { Component } from 'react';

class AdvancedErrorBoundary extends Component {
state = { hasError: false, error: null, errorInfo: null };

static getDerivedStateFromError(error) {
return { hasError: true, error };
}

componentDidCatch(error, errorInfo) {
this.setState({ errorInfo });
logErrorToService(error, errorInfo);
}

render() {
if (this.state.hasError) {
return ( <div> <h1>یک خطا رخ داده است</h1>
<details style={{ whiteSpace: 'pre-wrap' }}>
{this.state.error && this.state.error.toString()} <br />
{this.state.errorInfo?.componentStack} </details> </div>
);
}
return this.props.children;
}
}

function logErrorToService(error, info) {
console.log("ارسال خطا به سرویس:", error, info);
}

export default AdvancedErrorBoundary;

بهترین شیوه‌ها در ری‌اکت برای مدیریت خطا شامل استفاده از Error Boundaries، مدیریت امن عملیات غیرهمزمان، جلوگیری از تغییر مستقیم state و بهینه‌سازی عملکرد است. اشتباهات رایج شامل prop drilling بیش از حد، رندرهای غیرضروری و به‌روزرسانی‌های غیرقابل کنترل state می‌باشند.
برای بهبود عملکرد می‌توان از React.memo، useCallback و useMemo استفاده کرد. ابزارهای دیباگینگ مانند React DevTools و سرویس‌های مانیتورینگ خارجی مانند Sentry می‌توانند در شناسایی و پیگیری خطاها کمک کنند. از نظر امنیت، پیام‌های خطا نباید به کاربر نهایی نمایش داده شوند و فقط در لاگ‌ها ثبت شوند تا تجربه کاربری و امنیت برنامه حفظ شود.

📊 مرجع کامل

ری‌اکت (React) Element/Method Description Syntax Example Notes
ErrorBoundary گرفتن خطاهای کامپوننت‌های فرزند <ErrorBoundary>{children}</ErrorBoundary> <ErrorBoundary><FaultyComponent /></ErrorBoundary> مدیریت خطای محلی
getDerivedStateFromError به‌روزرسانی state هنگام خطا static getDerivedStateFromError(error) static getDerivedStateFromError(error) { return { hasError: true }; } فقط کامپوننت کلاس
componentDidCatch ثبت خطا componentDidCatch(error, info) componentDidCatch(error, info) { console.log(error, info); } برای مانیتورینگ
useState مدیریت state محلی const [state, setState] = useState(initial) const [count, setCount] = useState(0) از mutation مستقیم جلوگیری کنید
useEffect اجرای اثرات و عملیات async useEffect(() => {}, [dependencies]) useEffect(() => { fetchData(); }, []); بارگذاری داده
try/catch مدیریت خطاهای همزمان/غیرهمزمان try { ... } catch(error) { ... } try { const res = await fetch(url); } catch(e) { setError(e); } حفظ سازگاری state
setState به‌روزرسانی state کلاس this.setState({ key: value }) this.setState({ hasError: true }); از mutation مستقیم جلوگیری شود
React.memo جلوگیری از رندرهای غیرضروری export default React.memo(Component) export default React.memo(FaultyComponent); بهینه‌سازی عملکرد
PropTypes اعتبارسنجی props Component.propTypes = {...} FaultyComponent.propTypes = { count: PropTypes.number } کشف زودهنگام خطا
ErrorBoundaryFallback رابط کاربری جایگزین function Fallback() { return <div>Error</div>; } <ErrorBoundary fallback={<Fallback />}><Component /></ErrorBoundary> بهبود UX

📊 Complete ری‌اکت (React) Properties Reference

Property Values Default Description ری‌اکت (React) Support
hasError true, false false وضعیت خطا Class Components
error Error object null ذخیره خطا Class Components
errorInfo object null Stack trace کامپوننت Class Components
children ReactNode null کامپوننت‌های فرزند تمام کامپوننت‌ها
fallback ReactNode null رابط کاربری جایگزین هنگام خطا React 16+
getDerivedStateFromError function null به‌روزرسانی state هنگام خطا Class Components
componentDidCatch function null متد دریافت خطا Class Components
useState function null Hook مدیریت state Functional Components
useEffect function null Hook اثرات و async Functional Components
setState function null به‌روزرسانی state کلاس Class Components
React.memo function null جلوگیری از re-render غیرضروری Functional Components
PropTypes object null اعتبارسنجی props تمام کامپوننت‌ها

مدیریت خطاها در ری‌اکت برای ایجاد کامپوننت‌های پایدار و قابل اعتماد حیاتی است. استفاده از Error Boundaries، مدیریت امن عملیات غیرهمزمان و بهینه‌سازی عملکرد، برنامه را مقاوم در برابر کرش و خطا می‌کند. در مراحل بعدی، بررسی عملکرد، مدیریت state جهانی و ابزارهای مانیتورینگ به توسعه‌دهندگان کمک می‌کند تا خطاها را به صورت حرفه‌ای شناسایی و مدیریت کنند و تجربه کاربری بهینه ایجاد شود.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

4
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود