1
0
mirror of synced 2025-02-09 08:49:26 +03:00

Merge branch 'fix/#5796-catch-also-throwable-in-transactional-abstraction'

Close #5796
This commit is contained in:
Marco Pivetta 2017-09-02 13:58:08 +02:00
commit 4bc29d1049
No known key found for this signature in database
GPG Key ID: 4167D3337FD9D629
8 changed files with 33 additions and 17 deletions

View File

@ -19,7 +19,6 @@
namespace Doctrine\ORM;
use Exception;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DriverManager;
@ -28,6 +27,7 @@ use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\ORM\Proxy\ProxyFactory;
use Doctrine\ORM\Query\FilterCollection;
use Doctrine\Common\Util\ClassUtils;
use Throwable;
/**
* The EntityManager is the central access point to ORM functionality.
@ -237,7 +237,7 @@ use Doctrine\Common\Util\ClassUtils;
$this->conn->commit();
return $return ?: true;
} catch (Exception $e) {
} catch (Throwable $e) {
$this->close();
$this->conn->rollBack();

View File

@ -23,6 +23,7 @@ use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Types\Type;
use Doctrine\ORM\Query\AST;
use Doctrine\ORM\Utility\PersisterHelper;
use Throwable;
/**
* Executes the SQL statements for bulk DQL DELETE statements on classes in
@ -129,7 +130,7 @@ class MultiTableDeleteExecutor extends AbstractSqlExecutor
foreach ($this->_sqlStatements as $sql) {
$conn->executeUpdate($sql);
}
} catch (\Exception $exception) {
} catch (Throwable $exception) {
// FAILURE! Drop temporary table to avoid possible collisions
$conn->executeUpdate($this->_dropTempTableSql);

View File

@ -24,6 +24,7 @@ use Doctrine\DBAL\Types\Type;
use Doctrine\ORM\Query\ParameterTypeInferer;
use Doctrine\ORM\Query\AST;
use Doctrine\ORM\Utility\PersisterHelper;
use Throwable;
/**
* Executes the SQL statements for bulk DQL UPDATE statements on classes in
@ -188,7 +189,7 @@ class MultiTableUpdateExecutor extends AbstractSqlExecutor
$conn->executeUpdate($statement, $paramValues, $paramTypes);
}
} catch (\Exception $exception) {
} catch (Throwable $exception) {
// FAILURE! Drop temporary table to avoid possible collisions
$conn->executeUpdate($this->_dropTempTableSql);

View File

@ -23,6 +23,7 @@ use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Throwable;
/**
* Command to ensure that Doctrine is properly configured for a production environment.
@ -72,7 +73,7 @@ EOT
if ($input->getOption('complete') !== null) {
$em->getConnection()->connect();
}
} catch (\Exception $e) {
} catch (Throwable $e) {
$output->writeln('<error>' . $e->getMessage() . '</error>');
return 1;

View File

@ -92,7 +92,7 @@ class SchemaTool
foreach ($createSchemaSql as $sql) {
try {
$conn->executeQuery($sql);
} catch (\Exception $e) {
} catch (\Throwable $e) {
throw ToolsException::schemaToolFailure($sql, $e);
}
}
@ -742,8 +742,8 @@ class SchemaTool
foreach ($dropSchemaSql as $sql) {
try {
$conn->executeQuery($sql);
} catch (\Exception $e) {
} catch (\Throwable $e) {
// ignored
}
}
}

View File

@ -20,6 +20,7 @@
namespace Doctrine\ORM\Tools;
use Doctrine\ORM\ORMException;
use Throwable;
/**
* Tools related Exceptions.
@ -28,13 +29,7 @@ use Doctrine\ORM\ORMException;
*/
class ToolsException extends ORMException
{
/**
* @param string $sql
* @param \Exception $e
*
* @return ToolsException
*/
public static function schemaToolFailure($sql, \Exception $e)
public static function schemaToolFailure(string $sql, Throwable $e) : self
{
return new self("Schema-Tool failed with Error '" . $e->getMessage() . "' while executing DDL: " . $sql, "0", $e);
}

View File

@ -43,8 +43,8 @@ use Doctrine\ORM\Persisters\Entity\JoinedSubclassPersister;
use Doctrine\ORM\Persisters\Entity\SingleTablePersister;
use Doctrine\ORM\Proxy\Proxy;
use Doctrine\ORM\Utility\IdentifierFlattener;
use Exception;
use InvalidArgumentException;
use Throwable;
use UnexpectedValueException;
/**
@ -411,7 +411,7 @@ class UnitOfWork implements PropertyChangedListener
}
$conn->commit();
} catch (Exception $e) {
} catch (Throwable $e) {
$this->em->close();
$conn->rollBack();

View File

@ -232,6 +232,24 @@ class EntityManagerTest extends OrmTestCase
EntityManager::create(1, $config);
}
/**
* @group #5796
*/
public function testTransactionalReThrowsThrowables()
{
try {
$this->_em->transactional(function () {
(function (array $value) {
// this only serves as an IIFE that throws a `TypeError`
})(null);
});
self::fail('TypeError expected to be thrown');
} catch (\TypeError $ignored) {
self::assertFalse($this->_em->isOpen());
}
}
/**
* @group 6017
*/