diff --git a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Db/SchemaBuilder.php b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Db/SchemaBuilder.php index dc992898fb24..7a55ff922bba 100644 --- a/lib/internal/Magento/Framework/Setup/Declaration/Schema/Db/SchemaBuilder.php +++ b/lib/internal/Magento/Framework/Setup/Declaration/Schema/Db/SchemaBuilder.php @@ -1,7 +1,7 @@ elementFactory = $elementFactory; $this->dbSchemaReader = $dbSchemaReader; $this->sharding = $sharding; $this->readerComposite = $readerComposite; + $this->logger = $logger; } /** * @inheritdoc * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) + * @throws LocalizedException */ public function build(Schema $schema) { @@ -88,8 +100,22 @@ public function build(Schema $schema) foreach ($data['table'] as $keyTable => $tableColumns) { $tableColumns['column'] ??= []; foreach ($tableColumns['column'] as $keyColumn => $columnData) { - if ($columnData['type'] == 'json') { - $tablesWithJsonTypeField[$keyTable] = $keyColumn; + try { + if ($columnData['type'] == 'json') { + $tablesWithJsonTypeField[$keyTable] = $keyColumn; + } + } catch (\Throwable $e) { + // Create a new exception with extended context message + $errorMessage = sprintf( + "%s\nError processing table %s column %s", + $e->getMessage(), + $keyTable, + $keyColumn + ); + $this->logger->error($errorMessage); + // Throw a new exception with the extended message + // This preserves the original error but adds our context + throw new LocalizedException(new Phrase($errorMessage)); } } } diff --git a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php index ef3713679846..838d5f9b6a6f 100644 --- a/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php +++ b/lib/internal/Magento/Framework/Setup/Test/Unit/Declaration/Schema/Db/SchemaBuilderTest.php @@ -1,7 +1,7 @@ elementFactoryMock = $this->getMockBuilder(ElementFactory::class) @@ -401,11 +407,16 @@ public function testBuildHandlesMissingColumnsGracefully() ->method('read') ->willReturn($data); + $this->loggerMock = $this->getMockBuilder(LoggerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $schemaBuilder = new SchemaBuilder( $this->elementFactoryMock, $this->dbSchemaReaderMock, $this->shardingMock, - $readerCompositeMock + $readerCompositeMock, + $this->loggerMock ); $schemaBuilder->build($this->createMock(Schema::class));