pull/16091/head
Rich Harris 4 months ago
parent 682490dfd9
commit dc7e21d18e

@ -40,7 +40,7 @@ export function handle_error(error, effect, previous_effect = null) {
* @param {unknown} error * @param {unknown} error
* @param {Effect} effect * @param {Effect} effect
*/ */
function invoke_error_boundary(error, effect) { export function invoke_error_boundary(error, effect) {
/** @type {Effect | null} */ /** @type {Effect | null} */
var current = effect; var current = effect;

@ -114,13 +114,8 @@ function create_effect(type, fn, sync, push = true) {
} }
if (sync) { if (sync) {
try { update_effect(effect);
update_effect(effect); effect.f |= EFFECT_RAN;
effect.f |= EFFECT_RAN;
} catch (e) {
destroy_effect(effect);
throw e;
}
} else if (fn !== null) { } else if (fn !== null) {
schedule_effect(effect); schedule_effect(effect);
} }

@ -23,7 +23,8 @@ import {
LEGACY_DERIVED_PROP, LEGACY_DERIVED_PROP,
DISCONNECTED, DISCONNECTED,
BOUNDARY_EFFECT, BOUNDARY_EFFECT,
EFFECT_IS_UPDATING EFFECT_IS_UPDATING,
EFFECT_RAN
} from './constants.js'; } from './constants.js';
import { flush_tasks } from './dom/task.js'; import { flush_tasks } from './dom/task.js';
import { internal_set, old_values } from './reactivity/sources.js'; import { internal_set, old_values } from './reactivity/sources.js';
@ -39,7 +40,7 @@ import {
set_component_context, set_component_context,
set_dev_current_component_function set_dev_current_component_function
} from './context.js'; } from './context.js';
import { handle_error } from './error-handling.js'; import { handle_error, invoke_error_boundary } from './error-handling.js';
let is_flushing = false; let is_flushing = false;
@ -344,9 +345,18 @@ export function update_reaction(reaction) {
return result; return result;
} catch (error) { } catch (error) {
// TODO think we can just use active_effect here?
var effect = get_effect(reaction); var effect = get_effect(reaction);
if (effect) { 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 { } else {
throw error; throw error;
} }

Loading…
Cancel
Save