我無法弄清楚如何從隔離中捕獲例外。使用下面的代碼,我已經嘗試了所有我能想到的來處理從 拋出的錯誤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 {
var rp = ReceivePort();
var errorRp = ReceivePort();
errorRp.listen((e) {
print('exception occured');
print(e);
});
rp.listen(print);
await Isolate.spawn(task, rp.sendPort, one rror: errorRp.sendPort);
await Future.delayed(Duration(seconds: 1));
rp.close();
errorRp.close();
}
void task(SendPort sp) {
sp.send('hello from isolate');
throw Exception();
}
uj5u.com熱心網友回復:
我認為您錯過了以下檔案的重要部分Isolate.spawn:
您也可以在回傳的隔離上呼叫
setErrorsFatal、addOnExitListener和addErrorListener方法,但除非隔離以 啟動paused,否則在這些方法完成之前它可能已經終止。
你的問題是你的生成在你被執行之前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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410665.html
標籤:
