unstable_rethrow
يمكن استخدام unstable_rethrow
لتجنب التقاط الأخطاء الداخلية التي يطرحها Next.js عند محاولة التعامل مع الأخطاء المطروحة في كود التطبيق الخاص بك.
على سبيل المثال، استدعاء دالة notFound
سوف يطرح خطأً داخليًا في Next.js ويعرض مكون not-found.js
. ومع ذلك، إذا تم استخدامه داخل كتلة try/catch
، فسيتم التقاط الخطأ، مما يمنع عرض not-found.js
:
import { notFound } from 'next/navigation'
export default async function Page() {
try {
const post = await fetch('https://.../posts/1').then((res) => {
if (res.status === 404) notFound()
if (!res.ok) throw new Error(res.statusText)
return res.json()
})
} catch (err) {
console.error(err)
}
}
يمكنك استخدام واجهة برمجة التطبيقات unstable_rethrow
لإعادة طرح الخطأ الداخلي والاستمرار بالسلوك المتوقع:
import { notFound, unstable_rethrow } from 'next/navigation'
export default async function Page() {
try {
const post = await fetch('https://.../posts/1').then((res) => {
if (res.status === 404) notFound()
if (!res.ok) throw new Error(res.statusText)
return res.json()
})
} catch (err) {
unstable_rethrow(err)
console.error(err)
}
}
تعتمد واجهات برمجة التطبيقات التالية لـ Next.js على طرح خطأ يجب إعادة طرحه والتعامل معه من قبل Next.js نفسه:
إذا تم تعيين مقطع مسار لطرح خطأ ما لم يكن ثابتًا، فإن استدعاء API الديناميكي سوف يطرح أيضًا خطأً لا يجب التقاطه من قبل المطور. لاحظ أن التصيير الجزئي المسبق (PPR) يؤثر على هذا السلوك أيضًا. هذه الواجهات هي:
cookies
headers
searchParams
fetch(..., { cache: 'no-store' })
fetch(..., { next: { revalidate: 0 } })
معلومة مفيدة:
- يجب استدعاء هذه الطريقة في أعلى كتلة catch، وتمرير كائن الخطأ كوسيطتها الوحيدة. يمكن أيضًا استخدامها ضمن معالج
.catch
لوعد.- إذا تأكدت أن استدعاءاتك لواجهات برمجة التطبيقات التي تطرح أخطاءً ليست ملفوفة في try/catch، فلن تحتاج إلى استخدام
unstable_rethrow
.- أي تنظيف للموارد (مثل مسح الفواصل الزمنية، المؤقتات، إلخ) يجب أن يتم إما قبل استدعاء
unstable_rethrow
أو داخل كتلةfinally
.