pub(crate) fn handle<'a>(
        &self,
        cx: Scope<'a>,
        err: ClientError,
        pos: ErrorPosition,
    ) -> (String, View<G>, ScopeDisposer<'a>) {
        let reactor = try_use_context::<Reactor<G>>(cx);
        // From the given scope, we can perfectly determine the capabilities this error
        // view will have
        let info = match reactor {
            Some(reactor) => match reactor.try_get_translator() {
                Some(_) => ErrorContext::Full,
                None => ErrorContext::WithReactor,
            },
            None => ErrorContext::Static,
        };

        let mut body_view = View::empty();
        let mut head_str = String::new();
        let disposer = create_child_scope(cx, |child_cx| {
            let (head_view, body_view_local) = (self.handler)(child_cx, err, info, pos);
            body_view = body_view_local;
            // Stringify the head view with no hydration markers
            head_str = sycamore::render_to_string(|_| with_no_hydration_context(|| head_view));
        });

        (head_str, body_view, disposer)
    }
Invokes the user's handling function, producing head/body views for the
given error. From the given scope, this will determine the
conditions under which the error can be rendered.
packages/perseus/src/error_views.rs