diff --git a/packages/svelte/src/internal/client/error-handling.js b/packages/svelte/src/internal/client/error-handling.js index ead5e0646f..eaca6cf390 100644 --- a/packages/svelte/src/internal/client/error-handling.js +++ b/packages/svelte/src/internal/client/error-handling.js @@ -40,7 +40,7 @@ export function handle_error(error, effect, previous_effect = null) { * @param {unknown} error * @param {Effect} effect */ -function invoke_error_boundary(error, effect) { +export function invoke_error_boundary(error, effect) { /** @type {Effect | null} */ var current = effect; diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index ca1da7f9cd..6c7c21d7dc 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -114,13 +114,8 @@ function create_effect(type, fn, sync, push = true) { } if (sync) { - try { - update_effect(effect); - effect.f |= EFFECT_RAN; - } catch (e) { - destroy_effect(effect); - throw e; - } + update_effect(effect); + effect.f |= EFFECT_RAN; } else if (fn !== null) { schedule_effect(effect); } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 4eddd7d3bf..7745f975f8 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -23,7 +23,8 @@ import { LEGACY_DERIVED_PROP, DISCONNECTED, BOUNDARY_EFFECT, - EFFECT_IS_UPDATING + EFFECT_IS_UPDATING, + EFFECT_RAN } from './constants.js'; import { flush_tasks } from './dom/task.js'; import { internal_set, old_values } from './reactivity/sources.js'; @@ -39,7 +40,7 @@ import { set_component_context, set_dev_current_component_function } from './context.js'; -import { handle_error } from './error-handling.js'; +import { handle_error, invoke_error_boundary } from './error-handling.js'; let is_flushing = false; @@ -344,9 +345,18 @@ export function update_reaction(reaction) { return result; } catch (error) { + // TODO think we can just use active_effect here? var effect = get_effect(reaction); + if (effect) { - handle_error(error, effect); + if ((effect.f & EFFECT_RAN) !== 0) { + invoke_error_boundary(error, effect); + } else if ((effect.f & BOUNDARY_EFFECT) !== 0) { + // invoke directly + effect.fn(error); + } else { + throw error; + } } else { throw error; }