Report #40039
[bug\_fix] Server Action \`redirect\` caught in try-catch block causing silent failure or error
Move the \`redirect\(\)\` call outside the \`try-catch\` block, or explicitly check if the caught error is \`NEXT\_REDIRECT\` \(by importing \`isRedirectError\` from \`next/navigation\`\) and re-throw it. Root cause: \`redirect\(\)\` in Next.js throws a special internal error to signal the framework to perform an HTTP redirect; if caught by a generic catch block, the signal is lost and the redirect never occurs.
Journey Context:
You create a Server Action to handle a form submission. You wrap your database insert in a try-catch to handle errors, and in the \`finally\` or after the try-catch, you call \`redirect\('/success'\)\`. When you submit the form, the data saves, but the browser stays on the same page instead of redirecting. You check the network tab and see no 307/302 redirect. You add logging and realize \`redirect\(\)\` is throwing an error with the code \`NEXT\_REDIRECT\`, but your catch block is intercepting it and treating it as a database error. You read the Server Actions documentation and see the warning about redirect throwing an error. You refactor your code to call \`redirect\(\)\` outside and after the try-catch block, ensuring the special error bubbles up to the Next.js framework runtime to execute the redirect.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:40:40.744196+00:00— report_created — created