Skip to content

Commit a8961f5

Browse files
committed
feat(sveltekit-integration): add error boundary test page in sveltekit playground
1 parent 0be7489 commit a8961f5

4 files changed

Lines changed: 82 additions & 0 deletions

File tree

packages/sveltekit/playground/README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ Global browser error handlers that catch unhandled errors:
5757

5858
**Caught by Hawk Catcher.**
5959

60+
### Error Boundaries (🟢)
61+
62+
Svelte `<svelte:boundary>` catches errors during:
63+
64+
- Component rendering (synchronous errors in component body)
65+
- Component initialization
66+
67+
Example usage:
68+
69+
```sveltehtml
70+
<svelte:boundary onerror={handleBoundaryError} {failed}>
71+
<ErrorProneComponent />
72+
</svelte:boundary>
73+
74+
{#snippet failed(error, reset)}
75+
<div class="error-fallback">
76+
<p>Error: {error.message}</p>
77+
<button onclick={reset}>Reset</button>
78+
</div>
79+
{/snippet}
80+
```
81+
82+
**Not caught by Hawk Catcher.**
83+
6084
## Error Test Pages
6185

6286
The playground includes test pages to demonstrate each error catching mechanism:
@@ -70,3 +94,10 @@ The playground includes test pages to demonstrate each error catching mechanism:
7094
2. **Promise Rejection** (`/errors/promise-rejection`)
7195
- Demonstrates unhandled Promise rejection
7296
- Caught by window event listener `unhandledrejection`
97+
98+
### Error Boundaries (🟢) - Not caught by Hawk
99+
100+
1. **Boundary Error** (`/errors/boundary`)
101+
- Demonstrates svelte boundary feature
102+
- Caught by `<svelte:boundary>`
103+

packages/sveltekit/playground/src/routes/+page.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
href: '/errors/promise-rejection',
2121
category: 'Global Error Handlers (🟡)'
2222
},
23+
24+
// Error Boundaries
25+
{
26+
title: 'Boundary Error',
27+
description: 'Error caught by svelte:boundary',
28+
href: '/errors/boundary',
29+
category: 'Error Boundaries (🟢)'
30+
},
2331
];
2432
2533
const categories = Array.from(new Set(errorTests.map(t => t.category)));
@@ -41,6 +49,7 @@
4149
<li>Look for colored emoji markers:
4250
<ul>
4351
<li>🟡 = Caught by global <code>window.error</code> or <code>window.unhandledrejection</code></li>
52+
<li>🟢 = Caught by <code>&lt;svelte:boundary&gt;</code></li>
4453
</ul>
4554
</li>
4655
<li>Each test demonstrates where errors are caught in the SvelteKit error handling hierarchy</li>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<script lang="ts">
2+
import ErrorComponent from './ErrorComponent.svelte';
3+
4+
let showError = $state(false);
5+
6+
function triggerError() {
7+
showError = !showError;
8+
}
9+
10+
function handleBoundaryError(error: Error) {
11+
console.error('🟢 [svelte:boundary] Caught error:', error);
12+
}
13+
</script>
14+
15+
<div class="container">
16+
<h1>Error Boundary Test</h1>
17+
<p>Click the button to trigger a rendering error.</p>
18+
<p><strong>Caught by:</strong> <code>&lt;svelte:boundary&gt;</code> (🟢 green dot in console)</p>
19+
20+
<button onclick={triggerError} disabled={showError}>
21+
Trigger Error
22+
</button>
23+
24+
{#snippet failed(error, reset)}
25+
<div class="error-fallback">
26+
<h3>Error Boundary Caught Error</h3>
27+
<p>Message: {error.message}</p>
28+
<button onclick={() => { showError = false; reset(); }}>Reset</button>
29+
</div>
30+
{/snippet}
31+
32+
<svelte:boundary onerror={handleBoundaryError} {failed}>
33+
{#if showError}
34+
<ErrorComponent/>
35+
{/if}
36+
</svelte:boundary>
37+
</div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script lang="ts">
2+
throw new Error('Error caught by svelte:boundary');
3+
</script>
4+
5+
<div>This should not render if error is thrown</div>

0 commit comments

Comments
 (0)