2010-03-26 61 views
1

我不認爲這是可行的,但想把它扔到社區來確認我的懷疑。是否有可能以編程方式捕獲JavaScript語法錯誤?

假設您使用Python,PHP或ASP等其他語言編寫程序。此程序旨在構建另一個用JavaScript編寫的程序。但是,不幸的是,第一個程序不能避免錯誤。所以偶爾,構建JavaScript程序的程序會做一些時髦的事情,並在JavaScript源代碼中輸出一個語法錯誤。現在一些用戶去加載程序,它基本上停下來,因爲運行它的Web瀏覽器無法正確解析JavaScript。這個用戶可能不會很高興。我不會。

這使我想到我的問題。是否可以編寫一個錯誤處理程序來捕捉這些類型的語法問題,從而使應用程序能夠優雅地失敗?

下面是一個例子:

<html> 
    <head> 
    <script type="text/javascript" charset="utf-8"> 
    window.onerror = errorHandler; 
    function errorHandler(a,b,c) { 
    alert('horray! No wait, Booo!'); 
    } 
    vara jfs; 
    </script> 
    </head> 
    <body> 
    Can this be done? 
    </body> 
</html> 

<html> 
    <head> 
    <script type="text/javascript" charset="utf-8"> 
    try { 
    vara jfs; 
    } catch (e) { 
    alert('horray! No wait, Booo!'); 
    } 
    </script> 
    </head> 
    <body> 
    Can this be done? 
    </body> 
</html> 
+0

我非常感興趣,在這個答案我自己在這個項目中使用:http://www.boltbait.com/htmleditor/ – BoltBait 2010-03-26 19:29:43

回答

2

通常,編程語言被分析,並且在硬件或VM如果成功可能編譯成另一種形式,和如果成功則解釋/執行。只是因爲代碼通過一個階段,並不意味着它是有效的代碼。

您在詢問在最後階段運行的代碼是否可以意識到第一部分遇到的問題並處理它。

有些語言爲它自己的解析和編譯機制提供了各種鉤子。正如Cheeso提到的,eval是Javascript調用這種機制的方式。

與其將所有腳本包裝在字符串中,不如將它們放在JavaScript文件中,然後使用以下javascript(或類似)將它們加載到主程序中。

function load(file){ 
    var client = new XMLHttpRequest(); 
    client.open("GET", file, false); 
    client.send(null); 
    return client.responseText; 
    } 

    function include(file){ 
    try { 
     eval(load(file)); 
    } catch (e) { 
     alert("problem with file " + file); 
    } 
    } 
2

谷歌已經發布了自己的Closure toolset,其中包括一個JavaScript編譯器和極小。我沒有親自使用它,但聽過很多很棒的東西。此外,它顯然可以幫助您找到瀏覽器兼容性問題。

我不認爲它會幫助您執行實時分析,但仍然可能是一個有價值的工具。

2

如果您對安全風險感到滿意,您可以致電eval()查看相關代碼以檢測語法錯誤。

function say(x) { ... emit message in some way.... } 

var scriptlets = [ 
    "foof1 = function(a) {if (a == 7) { return \"A-OK\"; } } ", 
    "foof2 = function (a) {if argle bargle seventy 7, then this isn't going to work}" 
]; 

function verifyScriptlet(n) { 
    var s = scriptlets[n]; 
    try { 
     var x = eval(s); 
     say("verified #"+ n +", result: " + (typeof x)); 
    } 
    catch (exc1) 
    { 
     say("Exception while verifying #"+ n +": " + exc1.message); 
    } 
} 

verifyScriptlet(0); 
verifyScriptlet(1); 
+0

有趣的。儘管我對安全性曝光並不是特別滿意,但這絕對是一種方法。這點。 – Matty 2010-03-26 19:46:06

相關問題