2013-03-23 28 views
0

我想在我的Dart webapp中使用隔離,但我似乎無法使錯誤回調參數工作。 我有一個在Dartium中運行的非常基本的代碼。我應該如何使用Dart隔離unhandledExceptionCallback?

import "dart:isolate"; 

void main() { 
    print("Main."); 
    spawnFunction(test, (IsolateUnhandledException e) { 
    print(e); 
    }); 
} 

void test() { 
    throw "Ooops."; 
} 

我從來沒有看到任何比「主」。印在控制檯上。我做錯了什麼,或者現在這個壞了?

+0

據我所知,這還沒有實現。 – Ladicek 2013-03-23 13:21:37

+0

那麼現在捕獲和記錄Isolate消息的最簡單方法是什麼?隔離區不能訪問DOM,也不能打印到控制檯。我不知道異常在流上是否可序列化,因爲在這種情況下,我可以使用MessageBox和streamSpawnFunction變體將它們發送到主機代碼,並將它們打印到那裏。但是,這是醜陋的地獄:( – NagyI 2013-03-23 13:32:22

+0

好吧,這工作,但它的直到非常醜陋:)我可能會寫我自己的包裝隔離類。無論如何,我需要雙向溝通,這已經需要一些幫手代碼。我不知道爲什麼從早期的Dart版本中刪除Isolate類無論如何都不錯。我自己重新創建這些流是更困難的。 – NagyI 2013-03-23 14:22:49

回答

2

錯誤回調將在新隔離中執行。因此它不能是一個動態閉包,但需要是一個靜態函數。

我沒有測試過,但這應該工作:

import "dart:isolate"; 

bool errorHandler(IsolateUnhandledException e) { 
    print(e); 
    return true; 
} 

void test() { 
    throw "Ooops."; 
} 

void main() { 
    // Make sure the program doesn't terminate immediately by keeping a 
    // ReceivePort open. It will never stop now, but at least you should 
    // see the error in the other isolate now. 
    var port = new ReceivePort(); 
    print("Main."); 
    spawnFunction(test, errorHandler); 
} 

注:在dart2js這個功能仍然未實現。舊版本忽略了這個論點。較新的版本將拋出一個UnimplementedError。

相關問題