After committing this patch I got this feedback:
   https://sourceware.org/ml/gdb-patches/2019-01/msg00181.html
This patch makes the constructor of scoped_switch_fork_info explicit,
and wraps the core of the destructor in a TRY/CATCH block.
I've run this through the testsuite on X86-64/GNU Linux, however, this
code is not exercised, so this patch is untested.
gdb/ChangeLog:
	* linux-fork.c (scoped_switch_fork_info)
	<scoped_switch_fork_info>: Make explicit.
	<~scoped_switch_fork_info>: Wrap core in TRY/CATCH.
+2019-01-10  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * linux-fork.c (scoped_switch_fork_info)
+       <scoped_switch_fork_info>: Make explicit.
+       <~scoped_switch_fork_info>: Wrap core in TRY/CATCH.
+
 2019-01-10  Tom Tromey  <tom@tromey.com>
 
        * objfiles.h (objfile::reset_psymtabs): Update.
 
 public:
   /* Switch to the infrun state held on the fork_info identified by
      PPTID.  If PPTID is the current inferior then no switch is done.  */
-  scoped_switch_fork_info (ptid_t pptid)
+  explicit scoped_switch_fork_info (ptid_t pptid)
     : m_oldfp (nullptr)
   {
     if (pptid != inferior_ptid)
     if (m_oldfp != nullptr)
       {
        /* Switch back to inferior_ptid.  */
-       remove_breakpoints ();
-       fork_load_infrun_state (m_oldfp);
-       insert_breakpoints ();
+       TRY
+         {
+           remove_breakpoints ();
+           fork_load_infrun_state (m_oldfp);
+           insert_breakpoints ();
+         }
+       CATCH (ex, RETURN_MASK_ALL)
+         {
+           warning (_("Couldn't restore checkpoint state in %s: %s"),
+                    target_pid_to_str (fp->ptid), ex.message);
+         }
+       END_CATCH
       }
   }