我无法弄清楚如何从隔离中捕获例外。使用下面的代码,我已经尝试了所有我能想到的来处理从 抛出的错误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);
相反,做这样的事情来产生Isolate
as 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 评论