posts - 297,  comments - 1618,  trackbacks - 0
           

          說明:參見《JavaScript高級(jí)程序設(shè)計(jì)》第14章。

           

          一.             錯(cuò)誤分類

          1. 語法錯(cuò)誤

          也稱為解析錯(cuò)誤,發(fā)生在傳統(tǒng)編程語言的編譯時(shí),在JavaScript中發(fā)生在解釋時(shí),這些錯(cuò)誤是由代碼中的意外字符直接引起的,然后就不能直接編譯/解釋,eg,在一行代碼因缺少右括號(hào),產(chǎn)生了語法錯(cuò)誤。發(fā)生語法錯(cuò)誤時(shí),就不能繼續(xù)執(zhí)行代碼。在JavaScript中,只有在同一個(gè)線程中的代碼會(huì)受語法錯(cuò)誤的影響。在其他線程中的代碼和其他外部引用的文件中的代碼,如果不依賴于包含錯(cuò)誤的代碼,則可以繼續(xù)執(zhí)行。

          2. 運(yùn)行時(shí)錯(cuò)誤

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

          window.openMyFile();

          因不存在openMyFile()方法,瀏覽器會(huì)返回一個(gè)異常。異常只影響發(fā)生的線程,其他JavaScript線程即可繼續(xù)正常的執(zhí)行。

           

          二.             處理錯(cuò)誤

          1.       onerror事件處理函數(shù)

          它是第一個(gè)用來協(xié)助JavaScript處理錯(cuò)誤的機(jī)制。頁面上出現(xiàn)異常時(shí),error事件便在window對(duì)象上觸發(fā)。Eg.

           

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

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

           

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

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

          </script>

           

          1) 取出錯(cuò)誤信息

          onerror處理函數(shù)提供了三種信息來確定錯(cuò)誤確切的性質(zhì):

           i)錯(cuò)誤信息——對(duì)于給定錯(cuò)誤,瀏覽器會(huì)顯示同樣的信息;

           ii)URL——在哪個(gè)文件中發(fā)生了錯(cuò)誤;

          行號(hào)——給定URL中發(fā)生錯(cuò)誤的行號(hào)。

          訪問方法見如下例子:

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

          </script>

           

          2) 圖像載入錯(cuò)誤

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

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

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

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

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

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

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

          3) 處理語法錯(cuò)誤

          onerror還能處理語法錯(cuò)誤。但有一點(diǎn)必須注意,事件處理函數(shù)必須是頁面中第一個(gè)出現(xiàn)的代碼,因?yàn)槿绻Z法錯(cuò)誤出現(xiàn)在設(shè)置事件處理函數(shù)之前出現(xiàn),事件處理函數(shù)就沒有用了。

          注意:語法錯(cuò)誤會(huì)完全停止代碼的執(zhí)行。

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

           

          2.       try…catch語句

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

          try {
                  window.openFile1();
                  alert("成功調(diào)用openFile1方法");
          } catch (exception) {
                  alert("發(fā)生異常!");
          } finally {
                  alert("try..catch測(cè)試結(jié)束!");
          }

           

           Java不同,ECMAScript標(biāo)準(zhǔn)在try…catch語句中只能有一個(gè)catch語句,因?yàn)?/span>JavaScript是弱類型的語言,沒辦法指明catch子句中異常的特定類型。不管錯(cuò)誤是什么類型,都由同一個(gè)catch語句處理。但Mozilla對(duì)其進(jìn)行了擴(kuò)展,可加多個(gè)catch語句,不推薦這樣使用。

           finally用于包含無論是否有異常發(fā)生都要執(zhí)行的代碼,這對(duì)關(guān)閉打開的鏈接和釋放資源很有用。

          1) 嵌套try…catch語句

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

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

           

          2) Error對(duì)象

          發(fā)生錯(cuò)誤時(shí),JavaScript有個(gè)Error基類用于拋出。它有兩個(gè)特性:

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

            ii)message——實(shí)際的錯(cuò)誤信息。

          Error對(duì)象的name對(duì)應(yīng)于它的類,可以是如下值之一:

          EvalError:錯(cuò)誤發(fā)生在eval()函數(shù)中;

          RangeError:數(shù)字值超出JavaScript可表示的范圍;

          ReferenceError:使用了非法的引用;

          SyntaxError:在eval()函數(shù)調(diào)用中發(fā)生了語法錯(cuò)誤,其他的愈發(fā)錯(cuò)誤由瀏覽器報(bào)告,無法通過try…catch處理;

          TypeError:變量的類型不是預(yù)期所需的;

          URIError:在encodeURIdecodeURI函數(shù)發(fā)生了錯(cuò)誤。

          3) 判斷錯(cuò)誤類型

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

           

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

           

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

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

           

          4) 拋出異常的throw語句

          ECMAScript第三版引入,用于有目的的拋出異常,拋出的錯(cuò)誤對(duì)象可為字符串、數(shù)字、布爾值或?qū)嶋H的對(duì)象,也可以拋出Error對(duì)象(其構(gòu)造函數(shù)只有一個(gè)函數(shù),即錯(cuò)誤信息)。eg1. throw new Error(“錯(cuò)誤產(chǎn)生!”);

          eg2.
          function addTwoNumber(a, b) {

                 if (arguments.length < 2) {

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

          }

          }

          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) 評(píng)論(8)  編輯  收藏 所屬分類: Javascript


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

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

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

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊(cè)

          關(guān)注blog

          積分與排名

          • 積分 - 2296332
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 龙泉市| 河源市| 淳化县| 峨眉山市| 满城县| 阿拉善左旗| 汽车| 读书| 徐闻县| 社旗县| 淮安市| 华阴市| 惠东县| 白银市| 新干县| 宁强县| 乌拉特前旗| 扎赉特旗| 红安县| 育儿| 临汾市| 榆树市| 阿拉善盟| 舒城县| 扶余县| 互助| 唐海县| 华阴市| 田东县| 长岛县| 虎林市| 金秀| 台北市| 泸水县| 修武县| 新绛县| 泽普县| 团风县| 新竹县| 天长市| 大渡口区|