|  | // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | library handle_error_test; | 
|  |  | 
|  | import "dart:isolate"; | 
|  | import "dart:async"; | 
|  | import "package:async_helper/async_helper.dart"; | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | isomain1(replyPort) { | 
|  | RawReceivePort port = new RawReceivePort(); | 
|  | port.handler = (v) { | 
|  | switch (v) { | 
|  | case 0: | 
|  | replyPort.send(42); | 
|  | break; | 
|  | case 1: | 
|  | throw new ArgumentError("whoops"); | 
|  | case 2: | 
|  | throw new RangeError.value(37); | 
|  | case 3: | 
|  | port.close(); | 
|  | } | 
|  | }; | 
|  | replyPort.send(port.sendPort); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | asyncStart(); | 
|  | RawReceivePort reply = new RawReceivePort(null); | 
|  | // Start paused so we have time to set up the error handler. | 
|  | Isolate.spawn(isomain1, reply.sendPort, paused: true).then((Isolate isolate) { | 
|  | isolate.setErrorsFatal(false); | 
|  | Stream errors = isolate.errors; // Broadcast stream, never a done message. | 
|  | SendPort sendPort; | 
|  | StreamSubscription subscription; | 
|  | int state = 0; | 
|  | reply.handler = (port) { | 
|  | sendPort = port; | 
|  | port.send(state); | 
|  | reply.handler = (v) { | 
|  | Expect.equals(0, state); | 
|  | Expect.equals(42, v); | 
|  | state++; | 
|  | sendPort.send(state); | 
|  | }; | 
|  | }; | 
|  | subscription = errors.listen(null, onError: (error, stack) { | 
|  | switch (state) { | 
|  | case 1: | 
|  | Expect.equals(new ArgumentError("whoops").toString(), "$error"); | 
|  | state++; | 
|  | sendPort.send(state); | 
|  | break; | 
|  | case 2: | 
|  | Expect.equals(new RangeError.value(37).toString(), "$error"); | 
|  | state++; | 
|  | sendPort.send(state); | 
|  | reply.close(); | 
|  | subscription.cancel(); | 
|  | asyncEnd(); | 
|  | break; | 
|  | default: | 
|  | throw "Bad state for error: $state: $error"; | 
|  | } | 
|  | }); | 
|  | isolate.resume(isolate.pauseCapability); | 
|  | }); | 
|  | } |