diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php
index b638e46a..c1898734 100644
--- a/core/lib/Drupal/Core/Render/Renderer.php
+++ b/core/lib/Drupal/Core/Render/Renderer.php
@@ -353,10 +353,11 @@ protected function doRender(&$elements, $is_root_call = FALSE) {
     // Build the element if it is still empty.
     if (isset($elements['#lazy_builder'])) {
       $new_elements = $this->doCallback('#lazy_builder', $elements['#lazy_builder'][0], $elements['#lazy_builder'][1]);
-      // Throw an exception if #lazy_builder
-      // callback does not return a (renderable) array.
+      // Throw an exception if #lazy_builder callback does not return an array;
+      // provide helpful details for troubleshooting.
       if (!is_array($new_elements)) {
-        throw new \LogicException("#lazy_builder callbacks must return a valid renderable array, got $new_elements from " . $elements['#lazy_builder'][0]);
+        $wrong_type = gettype($new_elements);
+        throw new \LogicException("#lazy_builder callbacks must return a valid renderable array, got $wrong_type from " . $elements['#lazy_builder'][0]);
       }
       // Retain the original cacheability metadata, plus cache keys.
       CacheableMetadata::createFromRenderArray($elements)
diff --git a/core/tests/Drupal/Tests/Core/Render/RendererPlaceholdersTest.php b/core/tests/Drupal/Tests/Core/Render/RendererPlaceholdersTest.php
index c9f35444..31ae0f95 100644
--- a/core/tests/Drupal/Tests/Core/Render/RendererPlaceholdersTest.php
+++ b/core/tests/Drupal/Tests/Core/Render/RendererPlaceholdersTest.php
@@ -962,6 +962,19 @@ public function testCreatePlaceholderPropertyWithoutLazyBuilder() {
     $this->renderer->renderRoot($element);
   }
 
+  /**
+   * @covers ::render
+   * @covers ::doRender
+   */
+  public function testNonArrayReturnFromLazyBuilder() {
+    $element = [];
+    $element['#lazy_builder'] = ['Drupal\Tests\Core\Render\PlaceholdersTest::callbackNonArrayReturn', []];
+
+    $this->expectException(\LogicException::class);
+    $this->expectExceptionMessage('#lazy_builder callbacks must return a valid renderable array, got boolean from Drupal\Tests\Core\Render\PlaceholdersTest::callbackNonArrayReturn');
+    $this->renderer->renderRoot($element);
+  }
+
   /**
    * Create an element with a child and subchild. Each element has the same
    * #lazy_builder callback, but with different contexts. They don't modify
diff --git a/core/tests/Drupal/Tests/Core/Render/RendererTestBase.php b/core/tests/Drupal/Tests/Core/Render/RendererTestBase.php
index 4a243dca..b5e91a6e 100644
--- a/core/tests/Drupal/Tests/Core/Render/RendererTestBase.php
+++ b/core/tests/Drupal/Tests/Core/Render/RendererTestBase.php
@@ -314,11 +314,21 @@ public static function callbackTagCurrentTemperature($animal) {
     return $build;
   }
 
+  /**
+   * #lazy_builder callback; returns invalid renderable.
+   *
+   * @return bool
+   *   TRUE.
+   */
+  public static function callbackNonArrayReturn() {
+    return TRUE;
+  }
+
   /**
    * {@inheritdoc}
    */
   public static function trustedCallbacks() {
-    return ['callbackTagCurrentTemperature', 'callbackPerUser', 'callback'];
+    return ['callbackTagCurrentTemperature', 'callbackPerUser', 'callback', 'callbackNonArrayReturn'];
   }
 
 }
