拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 从隔离中捕获例外

从隔离中捕获例外

白鹭 - 2022-01-24 2095 0 0

我无法弄清楚如何从隔离中捕获例外。使用下面的代码,我已经尝试了所有我能想到的来处理从 抛出的错误task,但它仍然被标记为Unhandled exception

void main() async {
  try {
    var rp = ReceivePort();

    rp.listen((message) {
      print(message);
    }, one rror: (e) {
      print(e);
    });
    rp.handleError((e) {
      print(e);
    });
    var isolate = await Isolate.spawn(task, rp.sendPort);
    isolate.addErrorListener(rp.sendPort);
  } catch (e) {
    print(e);
  }
}

void task(SendPort sp) {
  sp.send('hello from isolate');
  throw Exception();
}

我在这里想念什么?我还按照以下答案的建议尝试了以下操作:

void main() async {
  try {
    var rp = ReceivePort();
    rp.listen((message) {
      print(message);
    }, one rror: (e) {
      print('Handling exception');
      print(e);
    });
    await Isolate.spawn(task, rp.sendPort, one rror: rp.sendPort);
  } catch (e) {
    print(e);
  }
}

void task(SendPort sp) {
  sp.send('hello from isolate');
  throw Exception();
}

uj5u.com热心网友回复:

我认为您错过了以下档案的重要部分Isolate.spawn

你的问题是你的生成在你被执行之前Isolate已经执行了。throw Exception()isolate.addErrorListener(rp.sendPort);

相反,做这样的事情来产生Isolateas paused,然后resume是它:

    var isolate = await Isolate.spawn(task, rp.sendPort, paused: true);
    isolate.addErrorListener(rp.sendPort);
    isolate.resume(isolate.pauseCapability!);

或者,您可以Isolate将错误处理程序作为生成的一部分提供:

var isolate = await Isolate.spawn(task, rp.sendPort, one rror: rp.sendPort);
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *