-       ((setq backend (with-demoted-errors "VC refresh error: %S"
-                        (vc-backend buffer-file-name)))
+       ((setq backend (let (debug-on-error)
+                        (with-demoted-errors "VC refresh error: %S"
+                          (vc-backend buffer-file-name))))

From my experience, you should always comment such things. Or add an automated test ensuring it. Or even better, do both. It is extremely non-obvious why this is needed at all and someone can easily undo your changes a few years later.

Paul

On Sun, 10 Sept 2023 at 15:40, Eli Zaretskii <eliz@gnu.org> wrote:
> Date: Sun, 10 Sep 2023 16:21:00 +0300
> Cc: pogonyshev@gmail.com, 65763@debbugs.gnu.org
> From: Dmitry Gutov <dmitry@gutov.dev>
>
> On 10/09/2023 09:26, Eli Zaretskii wrote:
> > diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
> > index a4de0a6..0715236 100644
> > --- a/lisp/vc/vc-hooks.el
> > +++ b/lisp/vc/vc-hooks.el
> > @@ -799,7 +799,7 @@ vc-refresh-state
> >       (add-hook 'vc-mode-line-hook #'vc-mode-line nil t)
> >       (let (backend)
> >         (cond
> > -       ((setq backend (with-demoted-errors "VC refresh error: %S"
> > +       ((setq backend (ignore-errors
> >                           (vc-backend buffer-file-name)))
> >           ;; Let the backend setup any buffer-local things he needs.
> >           (vc-call-backend backend 'find-file-hook)
>
> This seems to work better:

That'd be fine by me, but I'd still want to understand why
ignore-errors didn't work.

Thanks.