Bird
Raised Fist0
NextJSframework~10 mins

Server-side error handling in NextJS - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Server-side error handling
Request received
Run server code
Try block executes
Success
Return data
Return error response
Client receives response
The server tries to run code. If it works, it sends data. If an error happens, it catches it and sends an error response.
Execution Sample
NextJS
export async function GET() {
  try {
    const data = await fetchData();
    return new Response(JSON.stringify(data), { status: 200 });
  } catch (error) {
    return new Response('Error occurred', { status: 500 });
  }
}
This code tries to fetch data on a GET request and returns it. If fetching fails, it returns a 500 error response.
Execution Table
StepActionTry Block ResultCatch Block TriggeredResponse Returned
1Request receivedNo result yetNoNo
2Try to fetch dataSuccess: data fetchedNoNo
3Return success responseData returnedNoResponse with status 200 and data
4Request receivedNo result yetNoNo
5Try to fetch dataError thrownYesNo
6Catch block runsNoYesNo
7Return error responseNoYesResponse with status 500 and error message
💡 Execution stops after returning a response to the client.
Variable Tracker
VariableStartAfter Step 2 (Success)After Step 5 (Error)
dataundefinedfetched data objectundefined
errorundefinedundefinedError object
Key Moments - 2 Insights
Why does the catch block run only when an error happens?
Because the catch block runs only if the try block throws an error, as shown in execution_table rows 5-7 where an error triggers the catch.
What response does the server send when data fetch is successful?
It sends a response with status 200 and the data, as shown in execution_table row 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the response status when the catch block runs?
A200
B500
C404
D302
💡 Hint
Check the Response Returned column in rows 6 and 7 where the catch block triggers.
At which step does the try block successfully return data?
AStep 3
BStep 2
CStep 5
DStep 7
💡 Hint
Look at the Try Block Result and Response Returned columns in the execution table.
If fetchData always throws an error, how many times does the catch block run per request?
AZero times
BTwice
COnce
DMultiple times
💡 Hint
Refer to the flow where catch block runs only once per error thrown in the try block.
Concept Snapshot
Server-side error handling in Next.js uses try/catch.
Try block runs server code.
If error occurs, catch block sends error response.
Always return a Response object.
Use status codes like 200 for success, 500 for errors.
Full Transcript
In Next.js server-side code, when a request comes in, the server runs code inside a try block. If the code works without errors, it returns a success response with data and status 200. If an error happens, the catch block catches it and returns an error response with status 500. This ensures the client always gets a clear response. The execution table shows steps from receiving the request, trying to fetch data, and either returning success or catching errors and returning an error response. Variables like data and error change depending on success or failure. Understanding when the catch block runs and what response is sent helps beginners handle errors properly in server code.

Practice

(1/5)
1. What is the main purpose of using try...catch blocks in Next.js server-side functions?
easy
A. To style components dynamically
B. To catch and handle errors gracefully during server-side execution
C. To improve client-side rendering speed
D. To manage user authentication on the client

Solution

  1. Step 1: Understand server-side error handling

    Server-side functions can fail due to unexpected issues. Using try...catch helps catch these errors.
  2. Step 2: Purpose of try...catch

    The try block runs code that might fail, and the catch block handles errors to prevent crashes and provide feedback.
  3. Final Answer:

    To catch and handle errors gracefully during server-side execution -> Option B
  4. Quick Check:

    Error handling = catch errors gracefully [OK]
Hint: Try-catch blocks catch errors on the server side [OK]
Common Mistakes:
  • Confusing client-side and server-side error handling
  • Thinking try-catch improves UI styling
  • Assuming try-catch speeds up rendering
2. Which of the following is the correct syntax to catch errors in a Next.js server function?
easy
A. try { /* code */ } handle (error) { /* handle error */ }
B. catch { /* code */ } try (error) { /* handle error */ }
C. try { /* code */ } catch (error) { /* handle error */ }
D. try: { /* code */ } except (error) { /* handle error */ }

Solution

  1. Step 1: Recall JavaScript error handling syntax

    The correct syntax uses try { ... } catch (error) { ... } to catch errors.
  2. Step 2: Identify correct option

    try { /* code */ } catch (error) { /* handle error */ } matches the correct syntax. Other options use invalid keywords or order.
  3. Final Answer:

    try { /* code */ } catch (error) { /* handle error */ } -> Option C
  4. Quick Check:

    Correct try-catch syntax = try { /* code */ } catch (error) { /* handle error */ } [OK]
Hint: Remember: try then catch with parentheses [OK]
Common Mistakes:
  • Using incorrect keywords like except or handle
  • Swapping try and catch blocks
  • Omitting parentheses after catch
3. Consider this Next.js server function snippet:
export async function GET() {
  try {
    throw new Error('Failed to fetch data');
  } catch (error) {
    return new Response(error.message, { status: 500 });
  }
}

What will be the HTTP status code returned when this function runs?
medium
A. 400
B. 404
C. 200
D. 500

Solution

  1. Step 1: Analyze the thrown error

    The function throws an error with message 'Failed to fetch data'.
  2. Step 2: Check the catch block response

    The catch block returns a Response with status 500, indicating a server error.
  3. Final Answer:

    500 -> Option D
  4. Quick Check:

    Server error status code = 500 [OK]
Hint: Error caught returns status 500 by default [OK]
Common Mistakes:
  • Assuming status 200 despite error
  • Confusing 404 (not found) with server error
  • Ignoring the status property in Response
4. Identify the error in this Next.js server function code:
export async function GET() {
  try {
    const data = await fetch('https://api.example.com/data');
    return new Response(JSON.stringify(data));
  } catch (error) {
    return new Response('Error occurred', { status: 500 });
  }
}
medium
A. Not parsing fetch response to JSON before stringifying
B. Missing await on fetch call
C. Incorrect status code in catch block
D. No error handling implemented

Solution

  1. Step 1: Understand fetch response handling

    The fetch call returns a Response object, not the actual data. We must call response.json() to parse it.
  2. Step 2: Identify missing JSON parsing

    The code stringifies the Response object directly without parsing JSON, which is incorrect.
  3. Final Answer:

    Not parsing fetch response to JSON before stringifying -> Option A
  4. Quick Check:

    Parse response.json() before JSON.stringify() [OK]
Hint: Always parse fetch response with .json() before use [OK]
Common Mistakes:
  • Stringifying the Response object directly
  • Forgetting to await response.json()
  • Assuming fetch returns JSON data directly
5. You want to create a Next.js server function that fetches user data and returns a 404 status if the user is not found, or a 500 status if the fetch fails. Which code snippet correctly implements this error handling?
hard
A. export async function GET() { try { const res = await fetch('https://api.example.com/user'); if (!res.ok) { if (res.status === 404) return new Response('User not found', { status: 404 }); throw new Error('Fetch failed'); } const user = await res.json(); return new Response(JSON.stringify(user)); } catch { return new Response('Server error', { status: 500 }); } }
B. export async function GET() { const res = await fetch('https://api.example.com/user'); if (res.status === 404) return new Response('User not found', { status: 404 }); const user = await res.json(); return new Response(JSON.stringify(user)); }
C. export async function GET() { try { const user = await fetch('https://api.example.com/user').json(); return new Response(JSON.stringify(user)); } catch (error) { return new Response('User not found', { status: 404 }); } }
D. export async function GET() { try { const res = await fetch('https://api.example.com/user'); const user = await res.json(); return new Response(JSON.stringify(user)); } catch { return new Response('User not found', { status: 404 }); } }

Solution

  1. Step 1: Check for HTTP errors explicitly

    export async function GET() { try { const res = await fetch('https://api.example.com/user'); if (!res.ok) { if (res.status === 404) return new Response('User not found', { status: 404 }); throw new Error('Fetch failed'); } const user = await res.json(); return new Response(JSON.stringify(user)); } catch { return new Response('Server error', { status: 500 }); } } checks res.ok and handles 404 with a specific response, throwing errors for other failures.
  2. Step 2: Use try-catch for fetch failures

    The catch block returns a 500 status for server errors, correctly distinguishing error types.
  3. Final Answer:

    Correctly handles 404 if the user is not found and 500 if the fetch fails -> Option A
  4. Quick Check:

    Check res.ok and catch errors for 404 and 500 [OK]
Hint: Check res.ok and catch errors separately for 404 and 500 [OK]
Common Mistakes:
  • Not checking res.ok before parsing JSON
  • Returning 404 inside catch block incorrectly
  • Assuming fetch throws on 404 automatically