<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0
     

    說明:參見《JavaScript高級程序設計》第14章。

     

    一.             錯誤分類

    1. 語法錯誤

    也稱為解析錯誤,發生在傳統編程語言的編譯時,在JavaScript中發生在解釋時,這些錯誤是由代碼中的意外字符直接引起的,然后就不能直接編譯/解釋,eg,在一行代碼因缺少右括號,產生了語法錯誤。發生語法錯誤時,就不能繼續執行代碼。在JavaScript中,只有在同一個線程中的代碼會受語法錯誤的影響。在其他線程中的代碼和其他外部引用的文件中的代碼,如果不依賴于包含錯誤的代碼,則可以繼續執行。

    2. 運行時錯誤

    也稱為異常(exception,在編譯期/解釋器后)。此時,問題并不出在代碼的語法上,而是,嘗試完成的一個操作,在某些情況下是非法的。eg.

    window.openMyFile();

    因不存在openMyFile()方法,瀏覽器會返回一個異常。異常只影響發生的線程,其他JavaScript線程即可繼續正常的執行。

     

    二.             處理錯誤

    1.       onerror事件處理函數

    它是第一個用來協助JavaScript處理錯誤的機制。頁面上出現異常時,error事件便在window對象上觸發。Eg.

     

    <html>
        
    <head>
               
    <title>onerror例子</title>
               
    <script type="text/javascript">
                      window.onerror 
    = function() {
           alert("發生錯誤!");
    }

               
    </script>
           
    </head>
           
    <body onload="fuction1()">
           
    </body>
    </html>

     

     在上述代碼中,在頁面載入時嘗試調用不存在的函數,此時會引發一個異常。彈出“發生錯誤”的錯誤信息。但是,瀏覽器的錯誤信息也顯示出來了,如何在瀏覽器上隱藏它呢,只需onerror方法返回一個true即可。

    <script type="text/javascript">
         window.onerror 
    = function() {
         alert(“發生錯誤!”);
         
    return true;
    }

    </script>

     

    1) 取出錯誤信息

    onerror處理函數提供了三種信息來確定錯誤確切的性質:

     i)錯誤信息——對于給定錯誤,瀏覽器會顯示同樣的信息;

     ii)URL——在哪個文件中發生了錯誤;

    行號——給定URL中發生錯誤的行號。

    訪問方法見如下例子:

    <script type="text/javascript">
               window.onerror 
    = function(sMessage, sUrl, sLine) {
    alert("發生錯誤!\n" 
    + sMessage + "\nURL:" + sUrl + "\nLine Number:" + sLine);
    return true;
    }

    </script>

     

    2) 圖像載入錯誤

    window對象并非唯一支持onerror事件處理函數的對象,它對圖像對象也提供支持。當一個圖像由于文件不存在等原因未能成功載入時,error事件便在這個圖像上觸發。讓我們來看一個例子:

    <img src=”amigo.jpg” onerror=”alert(‘載入圖片時發生錯誤’)”/>

    上例直接在HTML中分配onerror事件處理函數。當然也可以通過腳本來分配事件處理函數,在設置圖像的src特性前,必須等待頁面完全載入,代碼如下:

    <html>
        
    <head>
               
    <title>Image錯誤測試</title>
            
    <script type="text/javascript">
                      
    function handleLoad() {
           document.images[
    0].onerror = function() {
           alert("載入圖片時發生錯誤!");
    }
    ;

    document.images[
    0].src = "amigo.jpg";
    }

                  
    </script>
           
    </head>
           
    <body onload="handleLoad()">
                  
    <img/>
           
    <body>
    </html>

    注意:與window對象的onerror事件處理函數不同,imageonerror事件任何的額外信息的參數。

    3) 處理語法錯誤

    onerror還能處理語法錯誤。但有一點必須注意,事件處理函數必須是頁面中第一個出現的代碼,因為如果語法錯誤出現在設置事件處理函數之前出現,事件處理函數就沒有用了。

    注意:語法錯誤會完全停止代碼的執行。

    說明:使用onerror事件處理函數的主要的問題是,它是BOM的一部分,所以,沒有任何標準能控制它的行為。因此,不同的瀏覽器使用這個事件處理錯誤的方式有明顯的不同,eg,在IE中發生error事件時,正常的代碼會繼續執行,所有的變量和數據都保留下來,并可通過onerror事件處理函數訪問。在Mozilla中,正常的代碼執行都會結束,同時所有的錯誤發生之前的變量和數據都被銷毀。

     

    2.       try…catch語句

    ECMPScript第三版,引入了try…catch語句。Eg.

    try {
            window.openFile1();
            alert("成功調用openFile1方法");
    } catch (exception) {
            alert("發生異常!");
    } finally {
            alert("try..catch測試結束!");
    }

     

     Java不同,ECMAScript標準在try…catch語句中只能有一個catch語句,因為JavaScript是弱類型的語言,沒辦法指明catch子句中異常的特定類型。不管錯誤是什么類型,都由同一個catch語句處理。但Mozilla對其進行了擴展,可加多個catch語句,不推薦這樣使用。

     finally用于包含無論是否有異常發生都要執行的代碼,這對關閉打開的鏈接和釋放資源很有用。

    1) 嵌套try…catch語句

    用來處理catch子句中的錯誤問題,讓我們來看一個例子,代碼如下:

    try {
        eval("a ++ b");
    } catch(oException) {
        alert("發生錯誤!");
        try {
          var aError = new Array(1000000000000000000000000000000000000000);
    } catch(exception) {
          alert("在catch子句中發生錯誤!");
    }
    } finally{
           alert("已完成")
    }

     

    2) Error對象

    發生錯誤時,JavaScript有個Error基類用于拋出。它有兩個特性:

      i)name——表示錯誤類型的字符串

      ii)message——實際的錯誤信息。

    Error對象的name對應于它的類,可以是如下值之一:

    EvalError:錯誤發生在eval()函數中;

    RangeError:數字值超出JavaScript可表示的范圍;

    ReferenceError:使用了非法的引用;

    SyntaxError:在eval()函數調用中發生了語法錯誤,其他的愈發錯誤由瀏覽器報告,無法通過try…catch處理;

    TypeError:變量的類型不是預期所需的;

    URIError:在encodeURIdecodeURI函數發生了錯誤。

    3) 判斷錯誤類型

    可采取如下兩種方法來判斷錯誤類型,第一種根據異常的name屬性判斷,如下:

     

    try {
            eval("a ++ b");
    } catch(oException) {
            if (oException.name = "SyntaxError") {
           alert("發生SyntaxError!");
    } else {
           alert("發生其他錯誤!");
    }

     

     第二中采用instanceof操作符,代碼如下:

    try {
            eval("a ++ b");
    } catch(oException) {
           if (oException instanceof SyntaxError) {
           alert("發生SyntaxError!");
    } else {
           alert("發生其他錯誤!");
    }
    }

     

    4) 拋出異常的throw語句

    ECMAScript第三版引入,用于有目的的拋出異常,拋出的錯誤對象可為字符串、數字、布爾值或實際的對象,也可以拋出Error對象(其構造函數只有一個函數,即錯誤信息)。eg1. throw new Error(“錯誤產生!”);

    eg2.
    function addTwoNumber(a, b) {

           if (arguments.length < 2) {

           throw new Error("需要傳入兩個數字!");

    }

    }

    try {
           result = addTwoNumber(90);
    } catch(oException) {
           if (oException instanceof SyntaxError) {
           alert("SyntaxError:" + oException.message);
    } else if (oException instanceof Error){
           alert(oException.message);
    }
    }
    posted on 2007-08-12 10:51 阿蜜果 閱讀(3550) 評論(8)  編輯  收藏 所屬分類: Javascript


    FeedBack:
    # re: JavaScript學習筆記——錯誤處理
    2007-08-12 11:50 | pass86
    good  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理
    2007-08-12 16:38 | BeanSoft
    厲害,支持一下.  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理[未登錄]
    2007-08-12 23:48 | -274°C
    <script type=”text/javascript”>
    window.onerror = function() {
    alert(“發生錯誤!”);
    return true;
    }
    </script>

    嗚嗚,我這里一直沒有按照你說的發生。在firefox里依然出現錯誤。“發生錯誤!”這個在IE ,ff下都沒有出現了。。。。
    onerror 方法,沒有起作用了?  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理
    2007-08-13 08:39 | 雪月
    阿蜜果 的文章也不錯哦。。。 看多了  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理[未登錄]
    2007-08-13 08:48 | 阿蜜果
    @ -274°C
    不好意思,其實是可以的,不過我的例子中字符有點不對,"都變成中文的“了
    :)  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理
    2007-08-13 10:25 | 楊愛友
    寫得好清晰,有耐心,有水平。繼續其他章節。  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理[未登錄]
    2007-08-13 11:44 | -274°C
    怪我,當時直接復制過來放到記事本保存就測試。看都沒有看。不過記事本還是不容易發現符號問題。打開UE就一眼看到了。恩,謝謝了。  回復  更多評論
      
    # re: JavaScript學習筆記——錯誤處理
    2007-10-19 10:52 | 彭濤
    太強了!  回復  更多評論
      
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 91视频免费观看| 国产精品网站在线观看免费传媒 | 亚洲娇小性色xxxx| 亚洲成aⅴ人片久青草影院按摩| 国产青草亚洲香蕉精品久久| eeuss影院www天堂免费| 国产一级淫片a免费播放口| 亚洲一级毛片免费观看| 成人免费777777| 国产成人亚洲影院在线观看| 亚洲va久久久噜噜噜久久| 亚洲AV无码一区二区三区人| 国产亚洲综合精品一区二区三区| 中国内地毛片免费高清| a拍拍男女免费看全片| 国产又大又黑又粗免费视频| 亚洲色偷拍区另类无码专区| 91精品国产亚洲爽啪在线影院| 亚洲AV无码乱码在线观看代蜜桃 | 中出五十路免费视频| 蜜桃视频在线观看免费视频网站WWW| 成人免费AA片在线观看| 亚洲日韩在线观看免费视频| 中文字幕亚洲综合久久| 色天使亚洲综合一区二区| 免费人成在线观看网站| 超pen个人视频国产免费观看| 亚洲精品夜夜夜妓女网| 亚洲午夜精品一区二区麻豆| 美女被免费网站91色| 国产精品美女午夜爽爽爽免费| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲精品V欧洲精品V日韩精品| 亚洲一级高清在线中文字幕| 国产男女爽爽爽免费视频| 免费可以在线看A∨网站| 中文字幕人成人乱码亚洲电影 | 免费观看大片毛片| 久久久久久亚洲精品中文字幕| 鲁死你资源站亚洲av| 污污网站免费观看|