에러는 두 가지로 나뉠 수 있다.
1. Expected Error : 예상 가능 오류
2. Uncaught Exceptions: 예기치 못한 오류
→ 이러한 오류는 명시적으로 처리해야 하며, 클라이언트에게 반환되어야 한다.
useActionState
hook을 사용하여 서버 액션(Server Actions)의 상태를 관리하고 처리 가능 이러한 방식은 try/catch
블록을 사용하지 않고 오류를 처리할 수 있도록 도와준다.throw new Error
)로 처리하는 것이 아니라, 반환값(return value
)으로 모델링 해야한다.'use server'
import { redirect } from 'next/navigation'
export async function createUser(prevState: any, formData: FormData) {
const res = await fetch('https://...')
const json = await res.json()
if (!res.ok) {
return { message: 'Please enter a valid email' }
}
redirect('/dashboard')
}
다음 server action을 useActionState
hook에 전달하고, 반환된 state
를 사용하여 오류 메세지를 표시할 수 있다.
'use client'
import { useActionState } from 'react'
import { createUser } from '@/app/actions'
const initialState = {
message: '',
}
export function Signup() {
const [state, formAction, pending] = useActionState(createUser, initialState)
return (
<form action={formAction}>
<label htmlFor="email">Email</label>
<input type="text" id="email" name="email" required />
{/* ... */}
<p aria-live="polite">{state?.message}</p>
<button disabled={pending}>Sign up</button>
</form>
)
}
반환된 state
값을 사용해 toast 메세지를 클라이언트 컴포넌트에서 보여줄 수 있다.
서버 컴포넌트 내에서 데이터를 가져올 때 response
를 활용해 if
조건부로 오류 메세지를 렌더링하거나 redirect
할 수 있다.
export default async function Page() {
const res = await fetch(`https://...`)
const data = await res.json()
if (!res.ok) {
return 'There was an error.'
}
return '...'
}
throw new Error
를 통해 처리해야되며 error boundaries에서 처리 된다. 1️⃣Common (일반적)
error.js
를 사용해 root layout 아래에서 오류를 처리한다. 2️⃣Optional(더 세부적인 오류 처리)
error.js
파일을 추가해 특정 페이지에서 발생하는 오류를 처리 3️⃣Uncommon(잘 사용되지 않음)
global-error.js
파일에서 관리할 수 있다.// app/dashboard/error.tsx
'use client' // Error boundaries must be Client Components
import { useEffect } from 'react'
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
useEffect(() => {
// Log the error to an error reporting service
console.error(error)
}, [error])
return (
<div>
<h2>Something went wrong!</h2>
<button
onClick={
// Attempt to recover by trying to re-render the segment
() => reset()
}
>
Try again
</button>
</div>
)
}
오류를 상위(부모) 오류 경계(Parent Error Boundary)로 전파하고 싶다면 error
컴포넌트에서 throw
를 사용해 예외를 발생시키면 된다.
error.tsx
파일을 배치해 세분화된 오류 처리가 가능