Обработка ошибок¶
В предыдущей главе вы узнали, как изменять данные с помощью Server Actions. Давайте посмотрим, как можно обрабатывать ошибки грациозно, используя операторы JavaScript try/catch
и API Next.js для не пойманных исключений.
Вот темы, которые мы рассмотрим
- Как с помощью специального файла
error.tsx
отлавливать ошибки в сегментах маршрута и показывать пользователю резервный UI. - Как использовать функцию
notFound
и файлnot-found
для обработки 404 ошибки (для несуществующих ресурсов).
Добавление try/catch
к действиям сервера¶
Во-первых, давайте добавим операторы JavaScript try/catch
в ваши действия сервера, чтобы вы могли изящно обрабатывать ошибки.
Если вы знаете, как это сделать, потратьте несколько минут на обновление своих действий сервера, или вы можете скопировать приведенный ниже код:
Раскрыть решение
/app/lib/actions.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Раскрыть решение
/app/lib/actions.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
Обратите внимание, что redirect
вызывается вне блока try/catch
. Это потому, что redirect
работает, выбрасывая ошибку, которая будет поймана блоком catch
. Чтобы избежать этого, вы можете вызвать redirect
после try/catch
. redirect
будет доступен только в случае успешного завершения try
.
Мы изящно справляемся с этими ошибками, отлавливая проблему с базой данных и возвращая полезное сообщение от нашего Server Action.
Что произойдет, если в вашем действии возникнет не пойманное исключение? Мы можем смоделировать это, вручную выбросив ошибку. Например, в действии deleteInvoice
бросьте ошибку в верхней части функции:
/app/lib/actions.ts | |
---|---|
1 2 3 4 5 6 7 |
|
Когда вы пытаетесь удалить счет-фактуру, вы должны увидеть ошибку на localhost. При запуске в производство вы хотите более изящно показывать пользователю сообщение, когда происходит что-то непредвиденное.
Здесь на помощь приходит файл Next.js error.tsx
. Убедитесь, что вы удалили эту добавленную вручную ошибку после тестирования и перед переходом к следующему разделу.
Обработка всех ошибок с помощью error.tsx
¶
Файл error.tsx
можно использовать для определения границ пользовательского интерфейса для сегмента маршрута. Он служит в качестве catch-all для непредвиденных ошибок и позволяет отображать пользователям резервный пользовательский интерфейс.
В папке /dashboard/invoices
создайте новый файл с именем error.tsx
и вставьте в него следующий код:
/dashboard/invoices/error.tsx | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
В приведенном выше коде вы заметите несколько вещей:
- "use client" -
error.tsx
должен быть клиентским компонентом. - Он принимает два реквизита:
error
: Этот объект является экземпляром родного объекта JavaScriptError
.reset
: Это функция для сброса границы ошибки. При выполнении функции будет предпринята попытка повторного отображения сегмента маршрута.
При повторной попытке удалить счет-фактуру вы должны увидеть следующий пользовательский интерфейс:
Обработка 404 ошибки с помощью функции notFound
¶
Еще один способ изящной обработки ошибок - использование функции notFound
. В то время как error.tsx
полезна для перехвата не пойманных исключений, notFound
можно использовать, когда вы пытаетесь получить несуществующий ресурс.
Например, посетите http://localhost:3000/dashboard/invoices/2e94d1ed-d220-449f-9f11-f0bbceed9645/edit.
Это поддельный UUID, который не существует в вашей базе данных.
Вы сразу увидите, как сработает error.tsx
, потому что это дочерний маршрут /invoices
, где определен error.tsx
.
Однако если вы хотите быть более конкретными, вы можете показать ошибку 404, чтобы сообщить пользователю, что ресурс, к которому он пытается получить доступ, не найден.
Вы можете подтвердить, что ресурс не был найден, зайдя в функцию fetchInvoiceById
в data.ts
и записав в консольный лог возвращаемый invoice
:
/app/lib/data.ts | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
Теперь, когда вы знаете, что счет-фактура не существует в вашей базе данных, давайте воспользуемся функцией notFound
для его обработки. Перейдите в /dashboard/invoices/[id]/edit/page.tsx
и импортируйте { notFound }
из 'next/navigation'
.
Затем вы можете использовать условие для вызова notFound
, если счет-фактура не существует:
/dashboard/invoices/[id]/edit/page.tsx | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Затем, чтобы показать пользователю UI ошибки, создайте файл not-found.tsx
внутри папки /edit
.
Внутри файла not-found.tsx
вставьте следующий код:
/dashboard/invoices/[id]/edit/not-found.tsx | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Обновите маршрут, и теперь вы должны увидеть следующий пользовательский интерфейс:
Имейте в виду, что notFound
будет иметь приоритет над error.tsx
, так что вы можете обратиться к нему, когда захотите обработать более специфические ошибки!
Какой файл в файле Next.js служит для устранения непредвиденных ошибок в сегментах маршрута?
Рекомендуемая литература¶
Чтобы узнать больше об обработке ошибок в Next.js, ознакомьтесь со следующей документацией:
Источник — https://nextjs.org/learn/dashboard-app/error-handling