Browse Source

Prevent exception in debugInfo from causing fatal error

Closes #16526
Sheldon Reiff 3 years ago
parent
commit
a043f52e40
2 changed files with 22 additions and 1 deletions
  1. 8 1
      src/Collection/Collection.php
  2. 14 0
      tests/TestCase/Collection/CollectionTest.php

+ 8 - 1
src/Collection/Collection.php

@@ -17,6 +17,7 @@ declare(strict_types=1);
 namespace Cake\Collection;
 
 use ArrayIterator;
+use Exception;
 use IteratorIterator;
 use Serializable;
 
@@ -120,8 +121,14 @@ class Collection extends IteratorIterator implements CollectionInterface, Serial
      */
     public function __debugInfo(): array
     {
+        try {
+            $count = $this->count();
+        } catch (Exception $e) {
+            $count = 'An exception occurred while getting count';
+        }
+
         return [
-            'count' => $this->count(),
+            'count' => $count,
         ];
     }
 }

+ 14 - 0
tests/TestCase/Collection/CollectionTest.php

@@ -22,9 +22,11 @@ use Cake\Collection\Collection;
 use Cake\Collection\Iterator\BufferedIterator;
 use Cake\ORM\Entity;
 use Cake\TestSuite\TestCase;
+use CallbackFilterIterator;
 use DateInterval;
 use DatePeriod;
 use DateTime;
+use Exception;
 use Generator;
 use InvalidArgumentException;
 use LogicException;
@@ -1872,6 +1874,18 @@ class CollectionTest extends TestCase
             'count' => 0,
         ];
         $this->assertSame($expected, $result);
+
+        $filter = function ($value) {
+            throw new Exception('filter exception');
+        };
+        $iterator = new CallbackFilterIterator(new ArrayIterator($items), $filter);
+        $collection = new Collection($iterator);
+
+        $result = $collection->__debugInfo();
+        $expected = [
+            'count' => 'An exception occurred while getting count',
+        ];
+        $this->assertSame($expected, $result);
     }
 
     /**