2016-04-28 69 views
1
<!DOCTYPE html> 
<html> 
    <head> 
    <title>Throw test</title> 
    </head> 
    <body> 
    <button onclick="throw 'does this abort the app'">CRASH</button> 
    </body> 
</html> 

此代碼作爲通用Windows應用程序(MSAppHost/3.0)(WWAHost.exe)運行時終止應用程序(退出代碼0x3)。有沒有辦法來防止這種行爲?未處理的JavaScript異常終止MSAppHost/WWAHost.exe

我已經嘗試添加一個窗口onerror處理程序,它不會阻止應用程序終止。

window.onerror = function(e) { return false; } 

編輯這是運行現有的HTML5應用程序基於科爾多瓦窗口10移動項目。不得不在每個事件處理程序中加入try catch將會是一個令人難以置信的工作量。

編輯在JavaScript中,異常應該僅中止事件的執行上下文而不是整個應用程序。

+0

雖然我支持圍繞全局異常處理程序的回答,但是您是否嘗試過'return true'?看來這是'onerror'停止冒泡異常的方法。 –

+0

不,我沒有,我現在會嘗試... –

+0

你是明星!這就是我做錯了,返回錯誤不真實。你可以添加你的評論作爲一個問題,所以我可以接受它。謝謝 –

回答

1

Is there a way to prevent this behaviour?

,以防止這種行爲的最好辦法是處理異常。除了記錄錯誤之外,全局異常處理程序通常不被接受,因爲它們不可能處理每個可能的異常,並且只會導致應用程序以未知狀態結束。

如果您無法在某處以可靠的方式處理異常,這意味着您不知道問題是什麼,並且由於未知狀態,您的應用程序可能會以其他方式失敗 - at這一點它可能會完全停止運行。


所有這一切說,在HTML中,你可以return trueonerror處理程序,而不是false,以防止進一步的起泡的除外。例如,這將登錄控制檯的錯誤,但不顯示未捕獲的錯誤:

$('button').click(function() { 
 
    console.log('a'); 
 
    throw "oops"; 
 
    console.log('b'); 
 
}); 
 
window.onerror = function(e) { 
 
    console.log('error', e); 
 
    return true; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button> 
 
test 
 
</button>

但是,這都將記錄錯誤,然後顯示一個未捕獲的錯誤:

$('button').click(function() { 
 
    console.log('a'); 
 
    throw "oops"; 
 
    console.log('b'); 
 
}); 
 
window.onerror = function(e) { 
 
    console.log('error', e); 
 
    //don't return true 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button> 
 
test 
 
</button>

+0

這是一個現有的html5應用程序。不得不在每個執行上下文中添加try catch將會是一個令人難以置信的工作量。在JavaScript中,異常應該只中止事件的執行上下文而不是整個應用程序。 –

+0

@Austin即使它只是中止當前的執行上下文,也不能保證什麼狀態的東西留下來,因爲根據定義它是未處理的,並且之後沒有清理。如果沒有適當的異常處理,任何不平凡的應用程序都會進入未知狀態並導致其他問題。 –

+0

寫得不好的事件處理程序可能會使應用程序處於未定義狀態,但這僅僅是因爲它的寫入事件處理程序寫得很差。在更新應用程序可能會使應用程序處於未知狀態的情況下,則應該使用try catch處理程序,但是在其不適用的情況下(在html5/javascript中)忽略a)異常,因爲它隻影響該特定事件,並且不會使應用程序處於未知狀態。 –

0

你試過添加一個catch子句嗎? 這使您能夠捕獲錯誤並且不會使應用程序崩潰。這將正確處理異常

+0

這是一個現有的html5應用程序。不得不在每個執行上下文中添加try catch將會是一個令人難以置信的工作量。在JavaScript中,異常應該只中止事件的執行上下文而不是整個應用程序。 –