2014-11-06 107 views
0

我有這樣有沒有辦法在Dart中捕捉JavaScript異常?

<polymer-element name="app-element"> 
    <template> 
    <core-icon icon="{{icon}}"></core-icon> 
    </template> 
    <script ...> 
</polymer-element> 
@CustomTag('app-element') 
class AppElement extends PolymerElement { 
    AppElement.created() : super.created(); 

    @observable 
    String icon = 'menu'; 

    clickHandler(e) { 
    icon = null; 
    } 
} 

這導致了這個異常

Exception caught during observer callback: TypeError: Cannot read property 'split' of null 
    at core-icon.Polymer.updateAlt (http://localhost:63342/core-elements/packages/core_elements/src/core-icon/core-icon.html:188:50) 
    at core-icon.Polymer.updateIcon (http://localhost:63342/core-elements/packages/core_elements/src/core-icon/core-icon.html:147:14) 
    at core-icon.g.invokeMethod (http://localhost:63342/core-elements/packages/polymer/src/js/polymer/polymer.js:13:25932) 
    at core-icon.g.notifyPropertyChanges (http://localhost:63342/core-elements/packages/polymer/src/js/polymer/polymer.js:13:24037) 
    at Object.x.report_ (http://localhost:63342/core-elements/packages/polymer/src/js/polymer/polymer.js:12:18274) 
    at Object.S.check_ (http://localhost:63342/core-elements/packages/polymer/src/js/polymer/polymer.js:12:22612) 
    at c (http://localhost:63342/core-elements/packages/polymer/src/js/polymer/polymer.js:12:12181) polymer.concat.js:4861x.report_ polymer.concat.js:4861S.check_ polymer.concat.js:5264c 

在我看來這是一個<core-icon>元素是,但<core-icon>,我要創建一個問題,但我的問題是無論如何:

有沒有辦法在Dart中捕捉到這樣的JavaScript異常?

我當然試圖用try/catchwindow.onError.listen((e)...);包裝行icon = null;沒有成功,雖然。

+0

你必須嘗試從通話的開始/ catch語句。這就是爲什麼try/catch圍繞'icon = null'沒有幫助。 爲什麼不使用:''。我不認爲這是一個錯誤,爲什麼你想圖標爲空? – Robert 2014-11-06 12:13:59

+0

目前還不清楚你通話的開始是什麼意思。我可以在綁定或代碼中檢查'null',但我仍然認爲'icon'變成'null'時不應該拋出'core-icon'。我並沒有故意將它設置爲'null',但是我偶然發現了這個問題,因爲在某些情況下,'icon'模型中的模型或字段必然會變爲'null'。上面的代碼被簡化爲可以重現問題的小例子。 – 2014-11-06 12:19:10

+0

也許有一種方法可以註冊一個允許處理這種異常的全局錯誤處理程序? – 2014-11-06 12:22:54

回答

0

我還沒有真正嘗試過,但我想這是解決方案:

來源:https://github.com/dart-lang/core-elements/issues/148#issuecomment-62574668

它看起來像實際的問題是被抓的JS側異常,然後就印刷到控制檯,這就是爲什麼我們無法訪問它。他們設置Observer._errorThrownDuringCallback爲true,因此,您可以添加以下的測試,它會適當地失敗:

expect(context['Observer']['_errorThrownDuringCallback'], false, 
    reason: 'Setting icon to null shouldn\'t throw an error.');