diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index 6ea873af2b5eaa6ee45c812937581b7a33f0948c..2dd0e05e485c3aca220c274ccf6926b28e54c758 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -67,11 +67,18 @@ public function getDefault() {
   public function listInfo() {
     if (!isset($this->list)) {
       $this->list = [];
-      $installed_themes = $this->configFactory->get('core.extension')->get('theme');
+      $installed_themes = array_keys($this->configFactory->get('core.extension')->get('theme'));
       if (!empty($installed_themes)) {
         $list = $this->themeList->getList();
-        foreach (array_keys($installed_themes) as $theme_name) {
-          $this->addTheme($list[$theme_name]);
+        foreach ($installed_themes as $theme) {
+          // Do not add installed themes that cannot be found by the
+          // extension.list.theme service. If a theme does go missing from the
+          // file system any call to ::getTheme() will result in an exception
+          // and an error being logged. Ignoring the problem here allows the
+          // theme system to fix itself while updating.
+          if (isset($list[$theme])) {
+            $this->addTheme($list[$theme]);
+          }
         }
       }
     }
diff --git a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
index 576815f249bdd07b3ae8926629aa26fc342a3341..c0ead44e1cd43bf9a5aada90844ee4e83a8abdf4 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php
@@ -46,7 +46,7 @@ protected function setUp(): void {
     $this->configFactory = $this->getConfigFactoryStub([
       'core.extension' => [
         'module' => [],
-        'theme' => [],
+        'theme' => ['stark' => 'stark'],
         'disabled' => [
           'theme' => [],
         ],
@@ -108,6 +108,16 @@ public function testThemeLibrariesEmpty(): void {
     }
   }
 
+  /**
+   * Test that a missing theme doesn't break ThemeHandler::listInfo().
+   *
+   * @covers ::listInfo
+   */
+  public function testMissingTheme(): void {
+    $themes = $this->themeHandler->listInfo();
+    $this->assertSame([], $themes);
+  }
+
 }
 
 /**