## Demo: error ### ErrorDemo.svelte ```svelte

Mochi catches any throw from a page's serverProps resolver or Svelte <script>, plus any request that doesn't match a route, and renders the built-in default error page. Pass your own errorPage to Mochi.serve() to replace it. The handleError hook runs for every error — use it to log, forward to an error tracker, sanitize the message, or return a Response to short-circuit rendering.

Try it:

A custom error component receives a single error prop with status, message, and (in development only) stack — typed as MochiErrorProps.

This site's handleError:

{@html handleErrorHtml}

Watch your dev server output while clicking the links above — each visit logs one handleError: line via logger from mochi-framework. Unmatched routes log error null; SSR throws log error present.

``` ### Error500.svelte ```svelte

You should never see this — the page throws during SSR.

``` ### routes.ts ```ts import { Mochi, error } from 'mochi-framework'; import type { MochiRouteValue } from 'mochi-framework'; export const routes: Record = { '/demos/error': Mochi.page('./src/demos/error/ErrorDemo.svelte'), '/demos/error/500': Mochi.page('./src/demos/error/Error500.svelte'), '/demos/error/404': Mochi.page('./src/demos/error/Error500.svelte', { serverProps: () => { error(404, 'This item does not exist.'); }, }), // Throws during SSR, but the site-wide handleError returns a redirect Response // for this pathname, so the error page is never rendered. '/demos/error/redirect': Mochi.page('./src/demos/error/Error500.svelte'), }; ``` ### index.ts ```ts import { Mochi, logger } from 'mochi-framework'; await Mochi.serve({ port: 3333, development: process.env.MODE === 'development', routes: { '/': Mochi.page('./src/Home.svelte'), }, }); logger.info('Server running at http://localhost:3333'); ```