Skip to content

Handling Errors ​

We have already discussed a little bit about errors and how to handle them usint React Query but in this section we'll go even more deeper.

Global Error Handling ​

You can find the this file in src/Providers.tsx

tsx
const queryClient = new QueryClient({
  defaultOptions: {
    mutations: {
      onError: (err) => {
        // Global error handling logic.
        // Again better to use a toast here.
        alert("An error occurred: " + err.message);
      },
    },
  },
});

Note: If you utilised onError callback both in QueryClient and useMutation hook, the later will take precedence.

Retrying ​

tsx
const { mutate } = trpc.products.delete.useMutation({
  retry: 3, // Will retry 3 times before failing
  retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000), // Exponential backoff
});

Error Boundaries ​

You can either use the error handling capabilites of React Query or use a error boundary.

tsx
<ErrorBoundary fallback={<div>Something went wrong</div>}>
  {/* This should be the component where useMutation hook is used */}
  <MyComponent />
</ErrorBoundary>

Handling Different Types of Errors ​

tsx
import { TRPCClientError } from "@trpc/react-query";

const { mutate } = trpc.products.delete.useMutation({
  onError: (err) => {
    if (err instanceof TRPCClientError) {
      // Use a toast for better user experience.
      if (err.data?.httpStatus === 401) {
        // Navigate to signIn page
        // return ...
      } 
      alert('OOPS! Deletion failed')
    } else {
      alert("Something went wrong");
    }
  },
});