Handle uncaught error for warnIfSlow (#56418)

diff --git a/packages/flutter_driver/lib/src/driver/vmservice_driver.dart b/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
index 52d3bcf..af9a4fb 100644
--- a/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
+++ b/packages/flutter_driver/lib/src/driver/vmservice_driver.dart
@@ -633,7 +633,15 @@
   assert(future != null);
   assert(timeout != null);
   assert(message != null);
-  return future..timeout(timeout, onTimeout: () { _log(message); return null; });
+  future
+    .timeout(timeout, onTimeout: () {
+      _log(message);
+      return null;
+    })
+    // Don't duplicate errors if [future] completes with an error.
+    .catchError((dynamic e) => null);
+
+  return future;
 }
 
 /// Encapsulates connection information to an instance of a Flutter application.
diff --git a/packages/flutter_driver/test/flutter_driver_test.dart b/packages/flutter_driver/test/flutter_driver_test.dart
index 18906b3..f60ad1b 100644
--- a/packages/flutter_driver/test/flutter_driver_test.dart
+++ b/packages/flutter_driver/test/flutter_driver_test.dart
@@ -665,6 +665,16 @@
           expect(error.message, 'Error in Flutter application: {message: This is a failure}');
         }
       });
+
+      test('uncaught remote error', () async {
+        when(mockIsolate.invokeExtension(any, any)).thenAnswer((Invocation i) {
+          return Future<Map<String, dynamic>>.error(
+            rpc.RpcException(9999, 'test error'),
+          );
+        });
+
+        expect(driver.waitFor(find.byTooltip('foo')), throwsDriverError);
+      });
     });
   });