diff --git a/lib/Doctrine/ORM/EntityManager.php b/lib/Doctrine/ORM/EntityManager.php
index d4b032bfc..99a9b15dc 100644
--- a/lib/Doctrine/ORM/EntityManager.php
+++ b/lib/Doctrine/ORM/EntityManager.php
@@ -19,7 +19,6 @@
namespace Doctrine\ORM;
-use Exception;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DriverManager;
@@ -237,7 +236,12 @@ use Doctrine\Common\Util\ClassUtils;
$this->conn->commit();
return $return ?: true;
- } catch (Exception $e) {
+ } catch (\Throwable $e) {
+ $this->close();
+ $this->conn->rollBack();
+
+ throw $e;
+ } catch (\Exception $e) { // PHP 5
$this->close();
$this->conn->rollBack();
diff --git a/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php b/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php
index aaf94d7ff..1ecd7a7b2 100644
--- a/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php
+++ b/lib/Doctrine/ORM/Query/Exec/MultiTableDeleteExecutor.php
@@ -129,11 +129,15 @@ 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);
// Re-throw exception
+ throw $exception;
+ } catch (\Exception $exception) { // PHP 5
+ $conn->executeUpdate($this->_dropTempTableSql);
+
throw $exception;
}
diff --git a/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php b/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php
index acad25a92..296b7d553 100644
--- a/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php
+++ b/lib/Doctrine/ORM/Query/Exec/MultiTableUpdateExecutor.php
@@ -188,11 +188,15 @@ 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);
// Re-throw exception
+ throw $exception;
+ } catch (\Exception $exception) { // PHP 5
+ $conn->executeUpdate($this->_dropTempTableSql);
+
throw $exception;
}
diff --git a/lib/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php
index 499565a01..e628b7049 100644
--- a/lib/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php
+++ b/lib/Doctrine/ORM/Tools/Console/Command/EnsureProductionSettingsCommand.php
@@ -72,7 +72,11 @@ EOT
if ($input->getOption('complete') !== null) {
$em->getConnection()->connect();
}
- } catch (\Exception $e) {
+ } catch (\Throwable $e) {
+ $output->writeln('' . $e->getMessage() . '');
+
+ return 1;
+ } catch (\Exception $e) { // PHP 5
$output->writeln('' . $e->getMessage() . '');
return 1;
diff --git a/lib/Doctrine/ORM/Tools/SchemaTool.php b/lib/Doctrine/ORM/Tools/SchemaTool.php
index 007ac85a8..e84a9c53d 100644
--- a/lib/Doctrine/ORM/Tools/SchemaTool.php
+++ b/lib/Doctrine/ORM/Tools/SchemaTool.php
@@ -92,7 +92,9 @@ class SchemaTool
foreach ($createSchemaSql as $sql) {
try {
$conn->executeQuery($sql);
- } catch (\Exception $e) {
+ } catch (\Throwable $e) {
+ throw ToolsException::schemaToolFailure($sql, $e);
+ } catch (\Exception $e) { // PHP 5
throw ToolsException::schemaToolFailure($sql, $e);
}
}
@@ -742,7 +744,9 @@ class SchemaTool
foreach ($dropSchemaSql as $sql) {
try {
$conn->executeQuery($sql);
- } catch (\Exception $e) {
+ } catch (\Throwable $e) {
+
+ } catch (\Exception $e) { // PHP 5
}
}
diff --git a/lib/Doctrine/ORM/Tools/ToolsException.php b/lib/Doctrine/ORM/Tools/ToolsException.php
index 0a4616404..ed6331118 100644
--- a/lib/Doctrine/ORM/Tools/ToolsException.php
+++ b/lib/Doctrine/ORM/Tools/ToolsException.php
@@ -30,11 +30,11 @@ class ToolsException extends ORMException
{
/**
* @param string $sql
- * @param \Exception $e
+ * @param \Exception $e The original exception, or duck-typed Throwable in PHP 7.
*
* @return ToolsException
*/
- public static function schemaToolFailure($sql, \Exception $e)
+ public static function schemaToolFailure($sql, $e)
{
return new self("Schema-Tool failed with Error '" . $e->getMessage() . "' while executing DDL: " . $sql, "0", $e);
}
diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php
index 0edd756f0..c5598cd4b 100644
--- a/lib/Doctrine/ORM/UnitOfWork.php
+++ b/lib/Doctrine/ORM/UnitOfWork.php
@@ -44,6 +44,7 @@ use Doctrine\ORM\Persisters\Entity\SingleTablePersister;
use Doctrine\ORM\Proxy\Proxy;
use Doctrine\ORM\Utility\IdentifierFlattener;
use Exception;
+use Throwable;
use InvalidArgumentException;
use UnexpectedValueException;
@@ -411,7 +412,14 @@ class UnitOfWork implements PropertyChangedListener
}
$conn->commit();
- } catch (Exception $e) {
+ } catch (\Throwable $e) {
+ $this->em->close();
+ $conn->rollBack();
+
+ $this->afterTransactionRolledBack();
+
+ throw $e;
+ } catch (\Exception $e) { // PHP 5
$this->em->close();
$conn->rollBack();