diff --git a/core/modules/user/src/Entity/Role.php b/core/modules/user/src/Entity/Role.php
index 267a75d5408cd3bfc7ed88cfdacd05381a9d21ef..2384e6ff373e1c31ea99fe1df456b9ac19925275 100644
--- a/core/modules/user/src/Entity/Role.php
+++ b/core/modules/user/src/Entity/Role.php
@@ -211,10 +211,15 @@ public function calculateDependencies() {
     $valid_permissions = array_intersect($this->permissions, array_keys($permission_definitions));
     $invalid_permissions = array_diff($this->permissions, $valid_permissions);
     if (!empty($invalid_permissions)) {
-      throw new \RuntimeException('Adding non-existent permissions to a role is not allowed. The incorrect permissions are "' . implode('", "', $invalid_permissions) . '".');
+      \Drupal::logger('user')->error('Non-existent permission(s) assigned to role "@label" (@id) were removed. Invalid permission(s): @permissions.', [
+        '@label' => $this->label(),
+        '@id' => $this->id(),
+        '@permissions' => implode(', ', $invalid_permissions),
+      ]);
+      $this->permissions = $valid_permissions;
     }
     foreach ($valid_permissions as $permission) {
-      // Depend on the module that is providing this permissions.
+      // Depend on the module that is providing this permission.
       $this->addDependency('module', $permission_definitions[$permission]['provider']);
       // Depend on any other dependencies defined by permissions granted to
       // this role.
diff --git a/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php b/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
index dacf9ed0124a2c86b824ec596bd910babc5d8215..11c0f5f8aa8f5322a3a07f064e448788280ba781 100644
--- a/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
+++ b/core/modules/user/tests/src/Kernel/UserRoleEntityTest.php
@@ -4,8 +4,11 @@
 
 namespace Drupal\Tests\user\Kernel;
 
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Logger\RfcLogLevel;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\user\Entity\Role;
+use Symfony\Component\ErrorHandler\BufferingLogger;
 
 /**
  * @group user
@@ -18,6 +21,16 @@ class UserRoleEntityTest extends KernelTestBase {
    */
   protected static $modules = ['system', 'user', 'user_permissions_test'];
 
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container): void {
+    parent::register($container);
+    $container
+      ->register(BufferingLogger::class)
+      ->addTag('logger');
+  }
+
   public function testOrderOfPermissions(): void {
     $role = Role::create(['id' => 'test_role', 'label' => 'Test role']);
     $role->grantPermission('b')
@@ -37,17 +50,27 @@ public function testGrantingNonExistentPermission(): void {
     $role = Role::create(['id' => 'test_role', 'label' => 'Test role']);
 
     // A single permission that does not exist.
-    $this->expectException(\RuntimeException::class);
-    $this->expectExceptionMessage('Adding non-existent permissions to a role is not allowed. The incorrect permissions are "does not exist".');
     $role->grantPermission('does not exist')
       ->save();
+    $log_message = \Drupal::service(BufferingLogger::class)->cleanLogs()[0];
+    $this->assertSame(RfcLogLevel::ERROR, $log_message[0]);
+    $this->assertSame('Non-existent permission(s) assigned to role "@label" (@id) were removed. Invalid permission(s): @permissions.', $log_message[1]);
+    $this->assertSame('Test role', $log_message[2]['@label']);
+    $this->assertSame('test_role', $log_message[2]['@id']);
+    $this->assertSame('does not exist', $log_message[2]['@permissions']);
 
-    // A multiple permissions that do not exist.
-    $this->expectException(\RuntimeException::class);
-    $this->expectExceptionMessage('Adding non-existent permissions to a role is not allowed. The incorrect permissions are "does not exist, also does not exist".');
+    // Multiple permissions that do not exist.
     $role->grantPermission('does not exist')
       ->grantPermission('also does not exist')
       ->save();
+    $log_message = \Drupal::service(BufferingLogger::class)->cleanLogs()[0];
+    $this->assertSame(RfcLogLevel::ERROR, $log_message[0]);
+    $this->assertSame('Non-existent permission(s) assigned to role "@label" (@id) were removed. Invalid permission(s): @permissions.', $log_message[1]);
+    $this->assertSame('Test role', $log_message[2]['@label']);
+    $this->assertSame('test_role', $log_message[2]['@id']);
+    $this->assertSame('does not exist, also does not exist', $log_message[2]['@permissions']);
+    $permissions = $role->getPermissions();
+    $this->assertEmpty(array_intersect(['does not exist', 'also does not exist'], $permissions));
   }
 
   public function testPermissionRevokeAndConfigSync(): void {