Support setExceptionPauseMode (#270)

diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md
index 9938634..cc65c80 100644
--- a/dwds/CHANGELOG.md
+++ b/dwds/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.1
+
+- Support `setExceptionPauseMode`.
+
 ## 0.2.0
 
 - Added custom tokens to the `wsUri` for increased security.
diff --git a/dwds/lib/src/chrome_proxy_service.dart b/dwds/lib/src/chrome_proxy_service.dart
index 8b9b79e..fa3a172 100644
--- a/dwds/lib/src/chrome_proxy_service.dart
+++ b/dwds/lib/src/chrome_proxy_service.dart
@@ -562,8 +562,16 @@
   }
 
   @override
-  Future<Success> setExceptionPauseMode(String isolateId, String mode) {
-    throw UnimplementedError();
+  Future<Success> setExceptionPauseMode(String isolateId, String mode) async {
+    // Validates that the ID is correct.
+    _getIsolate(isolateId);
+
+    var pauseState = _pauseModePauseStates[mode.toLowerCase()] ??
+        // ignore: only_throw_errors
+        (throw RPCError(
+            'setExceptionPauseMode', -32602, 'Unsupported mode `$mode`'));
+    await tabConnection.debugger.setPauseOnExceptions(pauseState);
+    return Success();
   }
 
   @override
@@ -836,3 +844,10 @@
     return description.toString();
   }
 }
+
+/// Converts from ExceptionPauseMode strings to [PauseState] enums.
+const _pauseModePauseStates = {
+  'none': PauseState.none,
+  'all': PauseState.all,
+  'unhandled': PauseState.uncaught,
+};
diff --git a/dwds/pubspec.yaml b/dwds/pubspec.yaml
index 82312bc..d5ff4c5 100644
--- a/dwds/pubspec.yaml
+++ b/dwds/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dwds
-version: 0.2.0
+version: 0.2.1
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/webdev/tree/master/dwds
 description: >-
diff --git a/dwds/test/chrome_proxy_service_test.dart b/dwds/test/chrome_proxy_service_test.dart
index 89efb4d..fd3d5d1 100644
--- a/dwds/test/chrome_proxy_service_test.dart
+++ b/dwds/test/chrome_proxy_service_test.dart
@@ -333,9 +333,18 @@
         throwsUnimplementedError);
   });
 
-  test('setExceptionPauseMode', () {
-    expect(() => service.setExceptionPauseMode(null, null),
-        throwsUnimplementedError);
+  test('setExceptionPauseMode', () async {
+    var vm = await service.getVM();
+    var isolateId = vm.isolates.first.id;
+    expect(await service.setExceptionPauseMode(isolateId, 'all'), isSuccess);
+    expect(
+        await service.setExceptionPauseMode(isolateId, 'unhandled'), isSuccess);
+    // Make sure this is the last one - or future tests might hang.
+    expect(await service.setExceptionPauseMode(isolateId, 'none'), isSuccess);
+    expect(
+        service.setExceptionPauseMode(isolateId, 'invalid'),
+        throwsA(isA<RPCError>()
+            .having((e) => e.code, 'invalid params error', equals(-32602))));
   });
 
   test('setFlag', () {