JavaScript 錯誤 & 異常處理

2018-09-28 18:05 更新

錯誤 & 異常處理

程序中存在三種錯誤: (a) 語法錯誤 (b) 運行期錯誤 (c) 邏輯錯誤:

語法錯誤

語法錯誤同樣也被稱為解析錯誤,對于傳統(tǒng)的編程語言,該錯誤出現(xiàn)先編譯的時候,對于 JavaScript 該錯誤出現(xiàn)在解釋時期。例如,下面的代碼會引起語法錯誤,因為在一行中缺少一個圓括號:

    <script type="text/javascript">
    <!--
    window.print(;
    //-->
    </script>

當在 JavaScript 中出現(xiàn)了語法錯誤的時候,僅僅只是在同一個包含該語法錯誤的進程才會受到影響,其他的進程中的代碼執(zhí)行不會受到影響,盡管他們依賴的代碼中包含錯誤。

運行期錯誤

運行期錯誤也被稱為異常,通常在編譯或者解釋之后運行時會出現(xiàn)。例如,下面的代碼會造成運行期錯誤,因為它試圖調(diào)用一個不存在的方法:

    <script type="text/javascript">
    <!--
    window.printme();
    //-->
    </script>

異常出現(xiàn)時會影響進程創(chuàng)建時的正常執(zhí)行,但是允許對于其他的 JavaScript 進程則可以繼續(xù)正常執(zhí)行。

邏輯錯誤

邏輯錯誤是最難被追蹤的錯誤類型。這些錯誤并不是語法或者運行時錯誤造成的, 而是由于你在程序運行的邏輯上出現(xiàn)錯誤,從而導(dǎo)致你的腳本程序并不能得到你想要的結(jié)果。

你并不能捕獲這些錯誤,因為它取決于你的業(yè)務(wù)邏輯需求,你想要在你的程序中實現(xiàn)怎樣的邏輯處理。

try...catch...finally 語句

JavaScript 的最新版本中添加了異常處理的功能。它實現(xiàn)了 try...catch...finally 結(jié)構(gòu)和 throw 操作用來處理異常。你可以捕獲程序員和運行期產(chǎn)生的異常,但是對于用戶不能捕獲 JavaScript 的語法錯誤。下面是 try...catch...finally 語法塊:

    <script type="text/javascript">
    <!--
    try {
        // Code to run
        [break;]
    } catch ( e ) {
        // Code to run if an exception occurs
        [break;]
    }[ finally {
        // Code that is always executed regardless of 
        // an exception occurring
    }]
    //-->
    </script>

try 語句塊后面必須跟著一個 catch 語句塊或者一個 finally 語句塊(或者同時包含他倆的一個語句塊)。當在 try 語句塊內(nèi)部產(chǎn)生了一個異常,這個異常就會被賦值給 e,接著 catch 語句塊被執(zhí)行。而可選的 finally 語句塊在 try/catch 之后一定會被執(zhí)行。

例子

如下是一個例子,我們嘗試調(diào)用一個不存在的方法,這個會導(dǎo)致異常的產(chǎn)生。我們首先看下沒有 try...catch 語句時運行情況:

    <html>
    <head>
    <script type="text/javascript">
    <!--
    function myFunc()
    {
       var a = 100;

       alert("Value of variable a is : " + a );

    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

接下來利用 try...catch 語句嘗試去捕獲程序的異常,并且給用戶提示一個友好的消息。如果你不想讓用戶看見這個錯誤,你也可以不讓這個消息產(chǎn)生。

    <html>
    <head>
    <script type="text/javascript">
    <!--
    function myFunc()
    {
       var a = 100;

        try {
            alert("Value of variable a is : " + a );
        } catch ( e ) {
            alert("Error: " + e.description );
        }
    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

你還可以使用 finally 語句,它會在 try/catch 語句之后必定執(zhí)行。如下例子所示:

    <html>
    <head>
    <script type="text/javascript">
    <!--
    function myFunc()
    {
        var a = 100;
        try {
            alert("Value of variable a is : " + a );
        }catch ( e ) {
            alert("Error: " + e.description );
        }finally {
            alert("Finally block will always execute!" );
        }
    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

throw 語句

你可以使用 throw 語句產(chǎn)生一個內(nèi)置的異?;蛘吣阕约憾ㄖ频漠惓?。之后這些異常可以被捕獲,而且捕獲后你可以采取合適的操作。

下面的是一個例子,展示如何使用 throw 語句。

    <html>
    <head>
    <script type="text/javascript">
    <!--
    function myFunc()
    {
        var a = 100;
        var b = 0;

        try{
          if ( b == 0 ){
             throw( "Divide by zero error." ); 
          }else{
             var c = a / b;
          }
        }catch ( e ) {
            alert("Error: " + e );
        }
    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

你可以在一個函數(shù)里面利用字符串,整型,布爾類型或者一個對象引起異常,接著你可以在同一個方法里面捕獲這個異常,或者在其他的函數(shù)里面利用 try...catch 語句塊捕獲異常。

onerror() 方法

onerror 事件句柄是 JavaScript 中添加的第一個為了方便錯誤處理的特性。無論任何時候在網(wǎng)頁中產(chǎn)生了異常,窗口對象就會觸發(fā) error 事件。例如:

    <html>
    <head>
    <script type="text/javascript"> 
    <!--
    window.onerror = function () {
       alert("An error occurred.");
    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

onerror 事件句柄提供了三個信息用來準確的表示錯誤的特性:

  • 錯誤消息。 瀏覽器顯示給定錯誤的相關(guān)信息。
  • URL。 錯誤出現(xiàn)的文件。
  • 行數(shù)。 在指定的 URL 中造成錯誤的行數(shù)。

如下是一個例子顯示如何得到上面的那些信息。

    <html>
    <head>
    <script type="text/javascript">
    <!--
    window.onerror = function (msg, url, line) {
        alert("Message : " + msg );
        alert("url : " + url );
        alert("Line number : " + line );
    }
    //-->
    </script>
    </head>
    <body>
    <p>Click the following to see the result:</p>
    <form>
    <input type="button" value="Click Me" onclick="myFunc();" />
    </form>
    </body>
    </html>

你可以用任何你認為更好的方式來顯示得到的信息。

你可以使用 onerror 方法來顯示一個錯誤消息,以免在加載圖片時出現(xiàn)任何的問題:

    <img src="myimage.gif"
        onerror="alert('An error occurred loading the image.')" />

如果程序中產(chǎn)生錯誤,你可以在很多的 HTML 標簽中使用 onerror 來顯示合適的消息。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號