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 阿蜜果 閱讀(3554) 評論(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

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安阳县| 泗洪县| 大足县| 鄄城县| 泰宁县| 西乌珠穆沁旗| 六盘水市| 刚察县| 定边县| 凤冈县| 琼海市| 建平县| 陆丰市| 嘉义市| 石台县| 河池市| 凌云县| 遵义县| 田东县| 武穴市| 余庆县| 招远市| 威远县| 陆良县| 宁乡县| 义乌市| 土默特左旗| 阜阳市| 富源县| 凌海市| 都匀市| 垦利县| 汾西县| 吴堡县| 墨江| 安丘市| 博爱县| 镇远县| 白城市| 赤壁市| 冕宁县|