JavaScript之錯誤處理
(一)錯誤和異常
談論起程式設計中的錯誤時,需要關心兩類主要錯誤:語法錯誤和執行時錯誤。語法錯誤,也稱為解析錯誤,發生在傳統程式語言的編譯時,在JavaScript中發生在解釋時。這些錯誤是由程式碼中的意外字元直接造成的,然後就不能完全編譯/解釋。發生語法錯誤時,就不能繼續執行程式碼。在JavaScript中,只有在同一個執行緒中的程式碼會受語法錯誤的影響。在其他執行緒中的程式碼和其他外部引用的檔案中的程式碼,如果 不依賴於包含錯誤的程式碼 ,則可以繼續執行。
執行時錯誤,也稱為異常(在編譯期/解釋期後)。此時,問題並不出在程式碼的語法上,而是,嘗試完成的一個操作,在某些情況下是非法的。例如,訪問window物件一個沒有的方法。異常隻影響它們發生的執行緒,其他JavaScript執行緒則可繼續正常的執行。
(二)錯誤報告
因為每個瀏覽器都有自己的內建JavaScript解釋程式(包含它自己的錯誤跟蹤機制),所以每種瀏覽器報告錯誤的方式都不同:有些是彈出錯誤資訊,有些是僅把資訊記錄在Javascript控制檯中。
(三)處理錯誤
JavaScript提供了兩種特別的處理錯誤的方法。BOM包含一個onerror事件處理函式,這在window物件和影象物件上都有,同時ECMAScript定義了另一個從Java中借過來的try……catch……結構來處理異常。
1、onerror事件處理函式
onerror事件處理函式是第一個用來協助JavaScript處理錯誤的機制,頁面上出現異常時,
error事件便在window物件上觸發。onerror事件處理函式提供了三種資訊來確定錯誤確切的性質:錯誤資訊——對於給定錯誤,瀏覽器會顯示同樣的資訊;URL——在哪個檔案中發生了錯誤;行號——給定URL中發生錯誤的行號,這三個資訊將作為三個引數傳遞給onerror事件處理函式。
2、影象載入錯誤
當一個影象由於某種原因未能成功載入時(例如,檔案不存在),error事件便在這個影象上觸發。如果要通過指令碼來分配事件處理函式,在影象的src特性前,必須等待頁面完全載入。與window物件的onerror事件處理函式不同,image的onerror事件處理函式沒有任何關於額外資訊的引數。
3、處理語法錯誤
onerror事件處理函式不僅可以處理異常,它還能處理語法錯誤,也只有它才能處理。
事件處理函式必須是頁面中第一個出現的程式碼,因為如果錯誤出現在設定事件處理函式之前,事件處理函式就沒用了。例如:
<html>
<title>錯誤處理例子</title>
<script type=”text/javascript”>
alert(“語法錯誤:”;
window.onerror=function(sMessage,sUrl,sLine){
alert(“錯誤發生在:\n”+sMessage+”\n檔名:”+sUrl+”\n行號:”+sLine);
}
</script>
<body onload=”nonExistentFunction()”>
</body>
</html>
在JS程式碼中,第一行程式碼(裡面有語法錯誤)在分配onerror事件處理函式之前就出現了,所有瀏覽器直接報告這個錯誤。在錯誤之後的所有程式碼就不再被解釋(因為這個執行緒已經退出了),所有onload事件觸發時呼叫nonExistentFunction(),瀏覽器也報告這個錯誤。 使用onerror事件處理函式的主要問題是:它是BOM的一部分,所以,沒有任何標準能控制它的行為。因此,不同的瀏覽器使用這個事件處理函式處理錯誤的方式明顯的不同。例如,在IE中發生error事件時,正常的程式碼會繼續執行,所有的變數和資料都保留下來,並可通過onerro事件處理函式訪問。然而,在其他瀏覽器中,正常的程式碼執行都會結束,同時,所有的錯誤發生之前的變數和資料都被銷燬。
4、try……catch語句
try{
//執行程式碼
[break;]
}catch([exception]){
//如果一個異常發生並且匹配
[break;]
}[finally{
//無論是否有異常都會執行的程式碼,這個對關閉開啟的連結和釋放資源很有用
}]
執行try……catch語句時,解釋程式首先進入try關鍵詞後的程式碼塊,如果產生錯誤,解釋程式立刻跳出try子句中,進入catch子句。與Java不同,ECMAScript標準在try……catch語句中指定只能有一個cathc子句。因為JavaScript是弱型別的語言,沒辦法指明catch子句中異常的特定型別,不管錯誤是什麼型別,都由一個catch子句處理。 1)巢狀的try……catch語句
在try……catch語句中的catch子句中,也有可能會發生錯誤,此時,就可以使用巢狀的try……catch語句。
5、Error物件
那麼catch語句捕獲的到底是什麼呢?類似於JavaScript有個可用於丟擲的基類Exception ,JavaScript有個Erro基類用於丟擲,Error物件有以下特性:name——表示錯誤型別的字串;message——實際的錯誤資訊。Error物件的名稱對應於它的類(因為Error只是一個基類),可以是以下值之一:
類 | 發生原因 |
EvalError | 錯誤發生在eval()函式中 |
RangeError | 數字的值超出JavaScript可表示的範圍(Number.MIN_VALUE和Number.MAX_VALUE) |
ReferenceError | 使用了非法的引用 |
SyntaxError | 在eval()函式呼叫中發生了語法錯誤,其他的語法錯誤由瀏覽器報告,無法通過try……catch語句處理 |
TypeError | 變數的型別不是預期所需的 |
URLError | 在encodeURI或者decodeURI函式中發生了錯誤 |
6、判斷錯誤型別
第一種方法使用Error物件的name特性:
try{
eval(“a ++ b”)
}catch(oException){
if(oException.name == “SyntaxError”){
alert(“語法錯誤:”+oException.message);
}else{
alert(“異常發生在:” +oException.message);
}
}
第二種方法使用instanceof操作符,並使用不同錯誤的類名,,其必須是if語句中的最後一個條件,因為所有其他的錯誤類都繼承於它。
try{
eval(“a ++ b”)
}catch(oException){
if(oException instanceof SyntaxError”){
alert(“語法錯誤:”+oException.message);
}else{
alert(“異常發生在:” +oException.message);
}
}
ECMAScript第三版還引入了throw語句,用於有目的地丟擲異常。語法如下:
throw error_object;
error_object可以是字串、數字、布林值或者是實際的物件,也可以丟擲一個Error物件。Error物件的建構函式只有一個引數,錯誤資訊,其他的Error子類也可以使用,如下: throw “一個異常發生”;
throw 5210;
throw true;
throw new Object();
throw Error(“型別錯誤”);
throw new RangeError(“資料超出範圍”);
相關推薦
JavaScript之錯誤處理
除錯JavaScript確實是一件痛苦的事,但現在有很多工具方便除錯工作(比如:Firefox的Firebug),更方便準確的檢視錯誤資訊。然而,最新的ECMAScript添加了導演處理機制,採用了從Java中移植過來的模型。ECMAScritp中一些保留字實現了try……
JavaScript之錯誤處理,函式物件
1.*錯誤處理: 錯誤:程式執行過程中,發生的導致程式無法繼續執行的狀態 錯誤處理:即使程式出錯,也要保證程式不退出的機制 Error物件:在發生錯誤時,*自動建立的封裝錯誤資訊的物件 屬性
PHP之錯誤處理
php錯誤報告 PHP程序的錯誤發生一般歸屬於下列三個領域: 1、語法錯誤 語法錯誤最常見,並且也容易修復。如:代碼中遺漏一個分號。這類錯誤會阻止腳本的執行 2、運行時錯誤 這種錯誤一般不會阻止PHP腳本的執行,但會阻止當前要做的事情。輸出一條錯誤,但php腳本繼續執行 3、邏輯錯誤 這種錯誤最
JavaScript的錯誤處理
encode turn catch 發送 ref blog 一定的 bool typeerror 一、錯誤類型 Error EvalErrorRangeErrorReferenceErrorsyntaxError 語法錯誤TypeError URIError
Lighttpd1.4.20源代碼分析 筆記 狀態機之錯誤處理和連接關閉
全部 階段 內存 and ces ons keep ren log 這裏所說的錯誤有兩種: 1.http協議規定的錯誤,如404錯誤。 2.server執行過程中的錯誤。如write錯誤。 對於http協議規定的錯誤,這裏的“錯誤”是針對clien
golang教程之錯誤處理
文章目錄 錯誤處理 什麼是錯誤? 例子 錯誤型別表示 從錯誤中提取更多資訊的不同方法 1.斷言底層結構型別並從結構域中獲取更多資訊 2.斷言底層結構型別並使用方法獲取更多資訊 3.直接比
JavaScript區域性錯誤處理、全域性錯誤處理及錯誤上報模組設計
JavaScript引擎執行JavaScript程式碼時,會發生各種錯誤:可能是語法或拼寫錯誤,可能是瀏覽器差異(使用了瀏覽器特有功能),也可能是伺服器返回異常未處理,當然還有許多其它不可預知的因素。當錯誤發生時,JavaScript 引擎會中斷後續程式碼執行,並生成一個錯誤訊息。為了
小白學python之錯誤處理_學習筆記
本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。 本文是學習到python的定製類。參考連結廖雪峰python錯誤處理。 本學習筆記僅供參考。 筆記: 在作業系統提供的呼叫中,返回錯誤碼非常常見。 比如,開啟檔案的函式op
SpringBoot——web開發之錯誤處理機制
一、SpringBoot提供的預設錯誤處理 1、在瀏覽器端訪問時,出現錯誤時響應一個錯誤頁面: 2、在其他客戶端訪問時,響應json資料: 3、錯誤處理機制的原理,參照錯誤自動配置類——ErrorMvcAutoConfiguration,在錯誤自動配置類中,配置
《程式碼大全》之錯誤處理技術(Error-Handling Techniques)
1、返回中立值 處理錯誤資料的最佳做法就是繼續執行操作並簡單地返回一個沒有危害的數值。 2、換用一下正確的資料 在處理資料流的時候,有時只需返回下一個正確的資料即可。 3、返回
RxJava之錯誤處理
在Observable發射資料時,有時傳送onError通知,導致觀察者不能正常接收資料。可是,有時我們希望對Observable發射的onError通知做出響應或者從錯誤中恢復。此時我們該如何處理呢?下面我們瞭解下RxJava錯誤處理相關的操作符。 catc
Linux系統程式設計之錯誤處理:perror,strerror和errno
轉自:http://www.linuxidc.com/Linux/2013-07/87238.htm 1,在系統程式設計中錯誤通常通過函式返回值來表示,並通過特殊變數errno來描述。 errno這個全域性變數在<errno.h>標頭檔案中宣告如下:ext
SpringBoot之錯誤處理機制以及定製錯誤資訊
一、SpringBoot預設的錯誤處理機制 預設效果: 1)、瀏覽器,返回一個預設的錯誤頁面 瀏覽器傳送請求的請求頭: 2)、如果是其他客戶端,預設響應一個json資料 原理: 可以參照ErrorMvcAutoConfigurat
JavaScript之事件處理(監聽)函式
JavaScript之事件處理(監聽)函式事件是使用者和瀏覽器自身進行的特定行為。這些事件都有自己的名字,如click,,load,mouseover。用於響應某個事件而呼叫的函式稱為事件處理函式,或者DOM稱之為事件監聽函式。事件處理函式有兩種分配方式:在JavaScri
Kettle使用_1轉換之錯誤處理
需求:通過kettle配置資料轉換失敗的日誌記錄.解決方法:通過表輸入、表輸出、文字檔案輸出等元件完成該功能.1) 配置資料庫連線,這裡輸入連線名、主機名稱、資料庫名稱、資料庫使用者名稱、密碼等資料庫的基本資訊2) 新建立個轉換,或者通過快捷鍵Ctrl+N建立 3) 在核
javascript中錯誤處理
由於js本身是動態語言,而且多年來一直沒有固定的開發工具,因此人們普遍認為他是一種難於除錯的程式語言。尤其是在指令碼出錯時,瀏覽器通常會給出類似於“object expected”(缺少物件)這樣的訊息,沒有上下文,讓人摸不著頭腦,後來便引入了try-catch和throw
c之錯誤處理
C 錯誤處理C 語言不提供對錯誤處理的直接支援,但是作為一種系統程式語言,它以返回值的形式允許您訪問底層資料。在發生錯誤時,大多數的 C 或 UNIX 函式呼叫返回 1 或 NULL,同時會設定一個錯誤程式碼 errno,該錯誤程式碼是全域性變數,表示在函式呼叫期間發生了錯誤
PHP之 錯誤 與 異常處理
函數 用戶 exceptio 產生 存放位置 如果 date error_log reporting PHP的錯誤報告有三種: 1.錯誤,語法解析錯誤,致命錯誤2.警告3.註意 錯誤 -> 致命錯誤,會終止已下程序的執行,語法錯誤的話,PHP壓根就沒執行警告 ->
JavaScript(六):錯誤處理機制
image || .cn final nta 構造函數 n) 示例 發生 1.Error()構造函數 javascript解析或執行語句時,一旦發生錯誤,js引擎會將其拋出! JavaScript原生提供了Error()構造函數,所有拋出的錯誤都是這個構造函數的實例(即對象
Python學習筆記之面對象與錯誤處理
實現 單繼承 父類 成對 數據類型 itl 同時 屬性 子類 反射 __import__()函數用於加載類和函數 __import__(name[, globals[, locals[, fromlist[, level]]]]) 參數說明: n