diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index f1557d4..355c33f 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -7,7 +7,9 @@
 
 namespace Drupal\migrate\Entity;
 
+use Drupal\Component\Utility\String;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 use Drupal\migrate\Plugin\RequirementsInterface;
@@ -196,6 +198,13 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
   public $migration_dependencies = array();
 
   /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
    * {@inheritdoc}
    */
   public function getSourcePlugin() {
@@ -315,28 +324,33 @@ public function saveHighWater($high_water) {
   public function checkRequirements() {
     // Check whether the current migration source and destination plugin
     // requirements are met or not.
-    try {
-      if ($this->getSourcePlugin() instanceof RequirementsInterface && !$this->getSourcePlugin()->checkRequirements()) {
-        return FALSE;
-      }
-      if ($this->getDestinationPlugin() instanceof RequirementsInterface && !$this->getDestinationPlugin()->checkRequirements()) {
-        return FALSE;
-      }
+    if ($this->getSourcePlugin() instanceof RequirementsInterface) {
+      $this->getSourcePlugin()->checkRequirements();
+    }
+    if ($this->getDestinationPlugin() instanceof RequirementsInterface) {
+      $this->getDestinationPlugin()->checkRequirements();
+    }
 
-      /** @var \Drupal\migrate\Entity\MigrationInterface[] $required_migrations */
-      $required_migrations = \Drupal::entityManager()->getStorage('migration')->loadMultiple($this->requirements);
-      // Check if the dependencies are in good shape.
-      foreach ($required_migrations as $required_migration) {
-        if (!$required_migration->isComplete()) {
-          return FALSE;
-        }
+    /** @var \Drupal\migrate\Entity\MigrationInterface[] $required_migrations */
+    $required_migrations = $this->getEntityManager()->getStorage('migration')->loadMultiple($this->requirements);
+
+    $missing_migrations = array_diff($this->requirements, array_keys($required_migrations));
+    // Check if the dependencies are in good shape.
+    foreach ($required_migrations as $migration_id => $required_migration) {
+      if (!$required_migration->isComplete()) {
+        $missing_migrations[] = $migration_id;
       }
     }
-    catch (\Exception $e) {
-      return FALSE;
+    if ($missing_migrations) {
+      throw new RequirementsException(String::format('Missing migrations @requirements', ['@requirements' => implode(', ', $missing_migrations)]), ['requirements' => $missing_migrations]);
     }
+  }
 
-    return TRUE;
+  protected function getEntityManager() {
+    if (!isset($this->entityManager)) {
+      $this->entityManager = \Drupal::entityManager();
+    }
+    return $this->entityManager;
   }
 
   /**
diff --git a/core/modules/migrate/src/Exception/RequirementsException.php b/core/modules/migrate/src/Exception/RequirementsException.php
new file mode 100644
index 0000000..98c4934
--- /dev/null
+++ b/core/modules/migrate/src/Exception/RequirementsException.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Exception\RequirementsException.
+ */
+
+namespace Drupal\migrate\Exception;
+
+use Exception;
+
+/**
+ * Defines an
+ *
+ * @see \Drupal\migrate\Plugin\RequirementsInterface
+ */
+class RequirementsException extends \RuntimeException {
+
+  /**
+   * The missing requirements.
+   *
+   * @var array
+   */
+  protected $requirements;
+
+  /**
+   * Constructs a new RequirementsException instance.
+   *
+   * @param string $message
+   *   (optional) The Exception message to throw.
+   * @param array $requirements
+   *   (optional) The missing requirements.
+   * @param int $code
+   *   (optional) The Exception code.
+   * @param \Exception $previous
+   *   (optional) The previous exception used for the exception chaining.
+   */
+  public function __construct($message = "", array $requirements = [], $code = 0, Exception $previous = NULL) {
+    parent::__construct($message, $code, $previous);
+
+    $this->requirements = $requirements;
+  }
+
+}
diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php
index 3f0d695..a8b3f33 100644
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Utility\Error;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\Plugin\MigrateIdMapInterface;
 
 /**
@@ -233,11 +234,18 @@ public function getSource() {
    */
   public function import() {
     // Knock off migration if the requirements haven't been met.
-    if (!$this->migration->checkRequirements()) {
+    try {
+      $this->migration->checkRequirements();
+    }
+    catch (RequirementsException $e) {
       $this->message->display(
-        $this->t('Migration @id did not meet the requirements', array('@id' => $this->migration->id())), 'error');
+        $this->t('Migration @id did not meet the requirements. @message', array(
+          '@id' => $this->migration->id(),
+          '@message' => $e->getMessage(),
+        )), 'error');
       return MigrationInterface::RESULT_FAILED;
     }
+
     $return = MigrationInterface::RESULT_COMPLETED;
     $source = $this->getSource();
     $id_map = $this->migration->getIdMap();
diff --git a/core/modules/migrate/src/Plugin/RequirementsInterface.php b/core/modules/migrate/src/Plugin/RequirementsInterface.php
index 8a5d816..5aa7db6 100644
--- a/core/modules/migrate/src/Plugin/RequirementsInterface.php
+++ b/core/modules/migrate/src/Plugin/RequirementsInterface.php
@@ -15,8 +15,8 @@
   /**
    * Checks if requirements for this plugin are OK.
    *
-   * @return bool
-   *   TRUE if it is possible to use the plugin, FALSE if not.
+   * @throws \Drupal\migrate\Exception\RequirementsException
+   *   Thrown when requirements are not met.
    */
   public function checkRequirements();
 
diff --git a/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php b/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
index 6fd3e97..084fd88 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/DestinationBase.php
@@ -10,6 +10,7 @@
 
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\Plugin\MigrateDestinationInterface;
 use Drupal\migrate\Plugin\RequirementsInterface;
 
@@ -53,7 +54,9 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
    * {@inheritdoc}
    */
   public function checkRequirements() {
-    return $this->pluginDefinition['requirements_met'];
+    if (empty($this->pluginDefinition['requirements_met'])) {
+      throw new RequirementsException();
+    }
   }
 
   /**
diff --git a/core/modules/migrate/tests/src/Unit/MigrationTest.php b/core/modules/migrate/tests/src/Unit/MigrationTest.php
new file mode 100644
index 0000000..450a2ee
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/MigrationTest.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\migrate\Unit\MigrationTest.
+ */
+
+namespace Drupal\Tests\migrate\Unit;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\migrate\Entity\Migration;
+use Drupal\migrate\Exception\RequirementsException;
+use Drupal\migrate\Plugin\MigrateDestinationInterface;
+use Drupal\migrate\Plugin\MigrateSourceInterface;
+use Drupal\migrate\Plugin\RequirementsInterface;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Entity\Migration
+ * @group Migration
+ */
+class MigrationTest extends UnitTestCase {
+
+  /**
+   * Tests checking requirements for source plugins.
+   *
+   * @covers ::checkRequirements
+   *
+   * @expectedException \Drupal\migrate\Exception\RequirementsException
+   * @expectedExceptionMessage Missing source requirement
+   */
+  public function testRequirementsForSourcePlugin() {
+    $migration = new TestMigration();
+
+    $source_plugin = $this->getMock('Drupal\Tests\migrate\Unit\RequirementsAwareSourceInterface');
+    $source_plugin->expects($this->once())
+      ->method('checkRequirements')
+      ->willThrowException(new RequirementsException('Missing source requirement', ['key' => 'value']));
+    $destination_plugin = $this->getMock('Drupal\Tests\migrate\Unit\RequirementsAwareDestinationInterface');
+
+    $migration->setSourcePlugin($source_plugin);
+    $migration->setDestinationPlugin($destination_plugin);
+
+    $migration->checkRequirements();
+  }
+
+  /**
+   * Tests checking requirements for destination plugins.
+   *
+   * @covers ::checkRequirements
+   *
+   * @expectedException \Drupal\migrate\Exception\RequirementsException
+   * @expectedExceptionMessage Missing destination requirement
+   */
+  public function testRequirementsForDestinationPlugin() {
+    $migration = new TestMigration();
+
+    $source_plugin = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface');
+    $destination_plugin = $this->getMock('Drupal\Tests\migrate\Unit\RequirementsAwareDestinationInterface');
+    $destination_plugin->expects($this->once())
+      ->method('checkRequirements')
+      ->willThrowException(new RequirementsException('Missing destination requirement', ['key' => 'value']));
+
+    $migration->setSourcePlugin($source_plugin);
+    $migration->setDestinationPlugin($destination_plugin);
+
+    $migration->checkRequirements();
+  }
+
+  /**
+   * Tests checking requirements for destination plugins.
+   *
+   * @covers ::checkRequirements
+   *
+   * @expectedException \Drupal\migrate\Exception\RequirementsException
+   * @expectedExceptionMessage Missing migrations test_a, test_c
+   */
+  public function testRequirementsForMigrations() {
+    $migration = new TestMigration();
+
+    // Setup source and destination plugins without any requirements.
+    $source_plugin = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface');
+    $destination_plugin = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface');
+    $migration->setSourcePlugin($source_plugin);
+    $migration->setDestinationPlugin($destination_plugin);
+
+    $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
+    $migration->setEntityManager($entity_manager);
+
+    // We setup the requirements that test_a doesn't exist and test_c is not
+    // completed yet.
+    $migration->setRequirements(['test_a', 'test_b', 'test_c', 'test_d']);
+
+    $migration_b = $this->getMock('Drupal\migrate\Entity\MigrationInterface');
+    $migration_c = $this->getMock('Drupal\migrate\Entity\MigrationInterface');
+    $migration_d = $this->getMock('Drupal\migrate\Entity\MigrationInterface');
+
+    $migration_b->expects($this->once())
+      ->method('isComplete')
+      ->willReturn(TRUE);
+    $migration_c->expects($this->once())
+      ->method('isComplete')
+      ->willReturn(FALSE);
+    $migration_d->expects($this->once())
+      ->method('isComplete')
+      ->willReturn(TRUE);
+
+    $migration_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
+    $migration_storage->expects($this->once())
+      ->method('loadMultiple')
+      ->with(['test_a', 'test_b', 'test_c', 'test_d'])
+      ->willReturn(['test_b' => $migration_b, 'test_c' => $migration_c, 'test_d' => $migration_d]);
+    $entity_manager->expects($this->once())
+      ->method('getStorage')
+      ->with('migration')
+      ->willReturn($migration_storage);
+
+    $migration->checkRequirements();
+  }
+
+}
+
+class TestMigration extends Migration {
+
+  public function __construct() {
+  }
+
+  public function setRequirements(array $requirements) {
+    $this->requirements = $requirements;
+  }
+
+  public function setSourcePlugin(MigrateSourceInterface $source_plugin) {
+    $this->sourcePlugin = $source_plugin;
+  }
+
+  public function setDestinationPlugin(MigrateDestinationInterface $destination_plugin) {
+    $this->destinationPlugin = $destination_plugin;
+  }
+
+  public function setEntityManager(EntityManagerInterface $entity_manager) {
+    $this->entityManager = $entity_manager;
+  }
+
+}
+
+interface RequirementsAwareSourceInterface extends MigrateSourceInterface, RequirementsInterface {}
+
+interface RequirementsAwareDestinationInterface extends MigrateDestinationInterface, RequirementsInterface {}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
index a3c4a17..56190de 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/DrupalSqlBase.php
@@ -7,8 +7,10 @@
 
 namespace Drupal\migrate_drupal\Plugin\migrate\source;
 
+use Drupal\Component\Utility\String;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\Plugin\migrate\source\SqlBase;
 use Drupal\migrate\Plugin\RequirementsInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -69,30 +71,26 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_definition,
       $migration
     );
+    return $plugin;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function checkRequirements() {
     /** @var \Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase $plugin */
-    if ($plugin_definition['requirements_met'] === TRUE) {
+    if ($this->pluginDefinition['requirements_met'] === TRUE) {
       if (isset($plugin_definition['source_provider'])) {
         if ($plugin->moduleExists($plugin_definition['source_provider'])) {
           if (isset($plugin_definition['minimum_schema_version']) && !$plugin->getModuleSchemaVersion($plugin_definition['source_provider']) < $plugin_definition['minimum_schema_version']) {
-            $plugin->checkRequirements(FALSE);
+            throw new RequirementsException(String::format('Required minimum schema version @minimum_schema_version', ['@minimum_schema_version' => $plugin_definition['minimum_schema_version']]), ['minimum_schema_version' => $plugin_definition['minimum_schema_version']]);
           }
         }
         else {
-          $plugin->checkRequirements(FALSE);
+          throw new RequirementsException(String::format('Missing source provider @provider', ['@provider' => $plugin_definition['source_provider']]), ['source_provider' => $plugin_definition['source_provider']]);
         }
       }
     }
-    return $plugin;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function checkRequirements($new_value = NULL) {
-    if (isset($new_value)) {
-      $this->requirements = $new_value;
-    }
-    return $this->requirements;
   }
 
   /**
