網頁技巧:妥善處理JavaScript中的錯誤

2020-12-12 站長之家
首頁

 > 

教程

 > 

關鍵詞

 > 

網頁最新資訊

 > 

正文

網頁技巧:妥善處理JavaScript中的錯誤

不管你的技術水平如何,錯誤或異常是應用程式開發者生活的一部分。Web開發的不連貫性留下了許多錯誤能夠發生並確實已經發生的地方。解決的關鍵在於處理任何不可預見的(或可預見的錯誤),來控制用戶的體驗。利用JavaScript,就有多種技術和語言特色可以用來正確地解決任何問題。

事事檢查

在開始之前檢查一切是一個好的編程習慣,也就是說,你應該在利用它們之前,檢查對象、方法調用等的有效性。這樣就避免了與未實例化對象或對不存在的方法調用有關的錯誤。列表A在使用對象(變量和欄位)之前會對它們進行檢查。在使用欄位對象之前,該腳本保證它們為有效或非空欄位。

列表A

以下為引用的內容:

<html>
<head>
<title>JS Test</title>
<script type="text/javascript">
function validate() {
var doc = document.forms[0];
var flag = true;
if (doc != null) {
if (doc.fullName != null) {
if (doc.fullName.value == '') {
flag = false;
}
} else      {
flag = false;
}
if (doc.contactNumber != null) {
if (doc.contactNumber.value == '') {
flag = false;
}
} else {
flag = false;
}
if (flag) {
alert('Validation successful, document will be submitted.');
doc.submit();
} else {
alert('Enter values before submitting.');
} }
return 0; }
</script>
</head>
<body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="validate();">
</form>
</body>
</html>

你並不需要實際地檢查有效性——你可以簡單地在if 語句中使用一個對象,如果它不是一個無效對象的話,所求得的值就為真。列表B就用了這種句法,同時也用到了getElementByID方法。它用了一個if語句來保證在繼續之前getElementByID方法是被支持的(存在)。

列表B

以下為引用的內容:

<html><head>
<title>JS Test</title>
<script type="text/javascript">
function validate() {
var doc = document.forms[0];
var flag = true;
if (doc != null) {
if (doc.getElementById) {
if (doc.getElementById("fullName")) {
if (doc.fullName.value == '') {
flag = false;
}
} else {
flag = false;
}
if (doc.getElementById("contactNumber")) {
if (doc.contactNumber.value == '') {
flag = false;
}
} else {
flag = false;
}
if (flag) {
alert('Validation successful, document will be submitted.');
doc.submit()
} else {
alert('Enter values before submitting.');
} }
return 0; }
</script>
</head>
<body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="validate();">
</form>
</body>
</html>

雖然在使用對象之前檢查它們是一個好方法,但是有時候還是會有錯誤出現。在這些實例中,JavaScript語言使得發現錯誤變得簡單,從而能夠繼續下去。

發現錯誤

和Java、C#等其他語言相類似,JavaScript中包括了try/catch/finally語句。一個try語句包含了一組代碼,在這組代碼中,像運行時間錯誤這樣的異常可能會發生。catch子句概述了怎樣處理錯誤,finally塊中包括了始終被執行的代碼。

一般來說,代碼設法執行一組代碼,如果沒有執行成功的話,支配權就傳到catch塊。如果沒有錯誤發生,就跳過catch塊。finally塊在try和catch塊完畢後執行。它的句法如下:

以下為引用的內容:
try
{
// code
}
catch
{
// code
}
finally
{
// code
}

catch和finally塊是可選的,但是如果沒有catch塊是沒有意義的。仔細考慮列表C,它示範了try/catch/finally的用法。從被引用的欄位在表格中不存在開始,錯誤就發生了。

列表C

以下為引用的內容:

<html>
<head>
<title>JS Test</title>
<script type="text/javascript">
function doIt() {
if (document.forms[0].firstName.value == '') {
// do something
}
return 0; }
</script>
</head>
<body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form>
</body>
</html>

一個try/catch塊不能避免錯誤,但是它能夠很得體地處理錯誤,這樣用戶就不會面對晦澀的瀏覽器出錯信息。觀察列表D。

列表D

以下為引用的內容:

<html>
<head>
<title>JS Test</title>
<script type="text/javascript">
function doIt() {
try {
if (document.forms[0].firstName.value == '') {
// do something
}
} catch(e) {
document.write("An unexpected error has occurred.<br><br>");
document.write("Please contact the administrator.<br><br>");
document.write(e.message);
} finally {
document.forms[0].submit();
}
return 0; }
</script></head>
<body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

它提示了以下信息,但是finally塊保證了窗體的提交——不管有什麼錯誤發生。

以下為引用的內容:
An unexpected error has occurred.
Please contact the administrator.
'document.forms.0.firstName.value' is null or not an object

單個catch塊可以處理所有問題,但是多個catch語句可以被用來處理特定的錯誤。這個問題在下個部分會涉及到。

用try/catch語句可以很容易地處理不可預見的錯誤。在某些情況下,可能你想以不同的方式處理錯誤,JavaScript提供了throw語句。它的句法是很基本的——throw後面緊跟要發生的異常。這就使得你能夠定義和引發自定義的異常。列表E中的代碼創建了一個缺失值的異常,並且它是生成的。

列表E

以下為引用的內容:
<html><head>
<title>JS Test</title>
<script type="text/javascript">
function MissingValueException (errMsg) {
this.message = errMsg;
this.name="MissingValueException";
}
function doIt() {
try {
if (document.forms[0].fullName.value == '') {
noNameException = new MissingValueException("First name is missing.");
throw noNameException;
} else {
document.forms[0].submit();
}
} catch(e) {
document.write("An unexpected error has occurred.<br>");
document.write("Please contact the administrator.<br>");
document.write(e.message);
} finally {
document.forms[0].submit();
}
return 0; }
</script></head><body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

它將會顯示以下信息(如果在欄位中沒有值輸入的話):

以下為引用的內容:

An unexpected error has occurred.
Please contact the administrator.
First name is missing.

除此之外,你還可以用運算符instanceof來確定異常的類型,從而做出反應。列表F中的代碼會檢查異常對象的類型並相應地顯示有關數據。

列表F

以下為引用的內容:

<html>
<head>
<title>JS Test</title>
<script type="text/javascript">
function MissingValueException (errMsg) {
this.message = errMsg;
this.name="MissingValueException";
}
function doIt() {
try {
if (document.forms[0].fullName.value == '') {
noNameException = new MissingValueException("First name is missing.");
throw noNameException;
}
} catch(e) {
if (e instanceofMissingValueException) {
document.write(e.message + "<br>");
document.write("Please contact the administrator.<br><br>");
} else {
document.write("An unexpected error has occurred.<br>");
document.write("Please contact the administrator.<br>");
document.write(e.message);
} } finally {
document.forms[0].submit();
} return 0; }
</script></head><body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

運算符instanceof可以同標準錯誤一起使用。JavaScript定義了以下標準的JavaScript錯誤類型:

EvalError:表明全局的eval函數使用錯誤。

RangeError:說明一個數值超過了所允許的值的範圍。

ReferenceError:發現了一個非法的引用。

SyntaxError:發生了一個句法分析錯誤。

TypeError:一個操作數的實際類型與所預期的類型不同。

URIError:其中一個全局URI函數(編碼URI或解碼URI)使用錯誤。

列表G中的代碼在一個catch語句中採用了TypeError類型。由於在引用欄位名(document)的行中多了一個d,結果發生了一個打字錯誤(ddocument)。

列表G

以下為引用的內容:

<html><head>
<title>JS Test</title>
<script type="text/javascript">
function MissingValueException (errMsg) {
this.message = errMsg;
this.name="MissingValueException";
}
function doIt() {
try {
if (ddocument.forms[0].fullName.value == '') {
noNameException = new MissingValueException("First name is missing.");
throw noNameException;
}
} catch(e) {
if (e instanceofTypeError) {
document.write("Reference error while accessing First Name field.<br><br>");
document.write("Please contact the administrator.<br><br>");
document.write(e.message);
} else {
document.write("An unexpected error has occurred.<br><br>");
document.write("Please contact the administrator.<br><br>");
document.write(e.message);
} } finally {
document.forms[0].submit();
} return 0; }
</script></head>
<body><form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

處理所有的頁面錯誤

另一個你可以自行支配的特性是window.onerror事件。和所有其他的JavaScript事件一樣,你可以定義一個函數或者一條代碼在事件被觸發時運行。它可以用來處理或忽略錯誤。列表H中的頁面顯示了遇到的所有JavaScript錯誤的簡單信息。因為指定的函數不存在,所以當點擊按鈕時,錯誤就發生了。列表I是用onerror事件來忽略所有的錯誤的。

列表H

以下為引用的內容:
<html><head>
<title>onError Test</title>
<script type="text/javascript">
function handleErrors() {
alert("A JavaScript error has occurred.");
return true;
}
window.onerror = handleErrors;
</script></head>
<body>
<form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

列表I

以下為引用的內容:

<html><head>
<title>JS Test</title>
<script type="text/javascript">
function ignoreErrors() {
return true;
}
window.onerror = ignoreErrors;
</script></head>
<body><form id="frmTest">
Name: <input id="fullName" name="fullName" type="text"><br>
Address: <input id="contactNumber" name="contactNumber" type="text"><br>
<input type="button" value="Submit" onclick="doIt();">
</form></body></html>

謹慎處理

錯誤是每一個應用程式的一部分,但是適當的錯誤處理卻不是。合理地運用JavaScript的錯誤處理特色和自動靈活的解碼可以使用戶的體驗更順暢,同時也讓開發方的診斷工作變得更輕鬆。

相關焦點

  • 網頁性能之html css javascript
    前言html css javascript可以算是前端必須掌握的東西了,但是我們的瀏覽器是怎樣解析這些東西的呢 我們如何處理html css javascript這些東西來讓我們的網頁更加合理,在我這裡做了一些實驗,總結起來給大家看看。
  • 第五篇:JavaScript事件處理
    初識JavaScript事件JavaScript語言本身不會產生事件,產生事件的是網頁文檔和網頁文檔中的HTML元素。什麼是事件呢?事件就是網頁文檔或網頁元素對外發出的通知。當HTML元素與用戶發生交互行為時,該元素會觸發相關的交互事件,例如:當用戶用滑鼠單擊網頁中的按鈕時,按鈕會觸發滑鼠單擊事件(onclick)。元素自身也會觸發事件,例如:當圖片元素加載完成後,會觸發加載完成事件(onload)。
  • 如何解決瀏覽器「網頁上有錯誤!
    朋友們都遇過網頁上有錯誤的情況,別急,有辦法!  1、首先點擊「開始」菜單,打開「運行」。  2、輸入regsvr32 jscript.dll後選擇「確定」。  出現提示後,點擊確定。  3、再次輸入regsvr32 vbscript.dll選擇「確定」。
  • JavaScript是什麼
    面向對象的思想—java、 C#腳本—寫好的程序不需要中間轉換,就能立即在運行環境中運行。javaScript,SQL為html網頁提供動態效果【特效】。完成與後臺處理程序數據交互。【1.發請求{要} 2.處理數據】簡單的具體操作:1.直接向html文件中寫出標記和內容。
  • JavaScript錯誤處理完全指南
    從技術上講,你可以在 JavaScript 中拋出任何內容,而不僅僅是錯誤對象:throw Symbol();throw 33;throw "Error!";throw null;但最好避免這些事情,始終拋出正確的錯誤對象,而不是基元。這樣,你就可以在代碼庫中保持錯誤處理的一致性。
  • 如何避免 JavaScript 開發者常犯的 9 個錯誤?
    JavaScript 是一種給網頁添加功能和交互的腳本語言,對於使用不同程式語言的初學者來說很容易理解。有了一些教程,你就可以馬上開始使用它了。但很多初學者都會犯一些常見的錯誤。在這篇文章中,我們將介紹 9 個常見的錯誤(或者說不好的實踐)以及它們的解決方案,幫助你成為更好的 JavaScript 開發者。將賦值操作符(=)和相等操作符(==,===)混為一談正如名稱所示,賦值操作符是用來給變量賦值的。開發者常常把它與相等操作符混淆。
  • 入門:初學ASP動態網頁製作常用錯誤處理
    首頁 > 語言 > 關鍵詞 > 網頁最新資訊 > 正文 入門:初學ASP動態網頁製作常用錯誤處理
  • 12 個非常有用的 JavaScript 技巧
    作者: Caio Ribeiro Pereira轉載自:W3CPlus http://www.w3cplus.com/javascript/12-extremely-useful-hacks-for-javascript.html 譯者: 大漠在這篇文章中將給大家分享12個有關於JavaScript的小技巧。
  • 網頁設計HTML_CSS_JavaScript語言_外部文件
    網頁描述語言—語言規則格式與例子。元素、標籤、屬性、標題、段落、樣式、引用、註解、連結、下劃線、字體、色彩、字號、……。紙介質或網頁版面涉及到的元素及其屬性。<>注釋不會在瀏覽器中顯示。--/<!--這是一段注釋。注釋不會在瀏覽器中顯示。--><br>隨後再添加獨立文件*.CSS與獨立文件*.js。以便可以專心思考頁面格式-樣式;以便可以專心思考網頁的用戶交互等。
  • 9 個JavaScript 技巧
    防止代碼崩潰在代碼中出現不可預測的行為是不好的,但是如果你有這種行為,你需要處理它。例如,常見錯誤TypeError,試獲取undefined/null等屬性,就會報這個錯誤。傳遞參數的好方法對於這個方法,一個很好的用例就是styled-components,在ES6中,我們可以將模板字符中作為函數的參數傳遞而無需使用方括號。
  • 7個處理JavaScript值為undefined的技巧
    通常這種冒險行為會產生「未定義」的相關錯誤,從而快速結束腳本。相關的常見錯誤消息是:function undefined() { // problem solved}為了減少這種錯誤的風險,您必須了解產生「undefined」時的情況。 更重要的是抑制其外觀並在應用程式中傳播,從而提高代碼的耐用性。
  • 解決JavaScript錯誤從未如此簡單!
    檢測,診斷和銷毀影響客戶的JavaScript錯誤。藉助Raygun提供的智能JavaScript錯誤跟蹤軟體,您可以提醒您影響用戶的問題,第二個問題發生。JavaScript錯誤往往會很嘈雜,並引發大量無用的信息。Raygun可以幫助您消除這些噪音,並專注於影響應用程式用戶數量最多的問題。
  • 由淺入深學習JavaScript Debug技巧
    ;// 顯示foo的值alert("Foo: " + foo);但如果你不小心將alert放在了for循環中,那就慘了。我曾經就遇到過,不得不強行將瀏覽器關閉。// 除非你喜歡alert, 不要這樣做!
  • JavaScript 錯誤和異常處理
    在編程中有三種類型的錯誤:1.句法錯誤 2.運行時錯誤 3. 邏輯錯誤。句法錯誤句法錯誤,也叫解析錯誤,發生在傳統程式語言的編譯時和JavaScript的解釋時。這些錯誤不是語法或運行時錯誤的結果。它們出現於在你編寫代碼時有邏輯錯誤從而在執行時不能得到預期的結果。你沒辦法捕獲這些錯誤,因為它們是你的業務代碼。try...catch...finally 語句這是 JavaScript 內置的錯誤處理工具,也是我們日常開發中常用的調試語句。
  • 關於JavaScript錯誤處理最完整的指南
    ;throw null;但最好避免這些事情,始終拋出正確的錯誤對象,而不是基元。這樣,你就可以在代碼庫中保持錯誤處理的一致性。其他團隊成員就能一直在錯誤對象上訪問 error.message 或 error.stack。
  • 你不知道的16條JavaScript調試技巧
    但一旦你掌握技巧,了解了工具本身,便能節省一大把時間。以下16條調試技巧,可供您在下次調試JavaScript代碼時使用!這些技巧大多數都適用於Chrome和Firefox,許多技巧也可以與其他檢查員一起使用。
  • 網頁布局:CSS控制表格嵌套
    網頁設計應用中,當我們不能完全放棄表格的使用時,為了達到預期的效果,不免要用到表格嵌套(特別是多層嵌套)方式來進行布局。可能很多同仁都遇到過這樣的問題,對了達到顯示效果要為每一個(每一層)的表格寫不同的CSS代碼或加不同的屬性值。這樣寫出來的代碼可讀性非常差,不便修改和管理。學會用CSS中的偽類這個問題就迎刃而解了,看一看我的處理方法吧。
  • 如何正確地在XHTML文檔中使用JavaScript和CSS
    在越來越多的網站中,XHTML的使用正以很快的速度替代HTML4,但是,目前一些主流瀏覽器對XHTML的支持還不是很好,加上一些網頁製作者對XHTML和HTML4之間的差異理解不夠,使得XHTML在WEB發展上進程變得緩慢。XHTML是XML而不是HTML目前,對XHTML的一個主要誤解是它是HTML的另外一個版本。
  • 年輕人的人緣越來越差,掌握三個技巧,讓你妥善處理好人際關係
    很多年輕人都希望能夠在職場中獲得相當了不起的成就,被領導和同事所欣賞,所以他們都會努力的完成分內工作,並且提升自己的技術能力,除此之外還會妥善處理好人際關係,但是這些年輕人卻因為自己的情商較低,或者是不會說話,導致他們在處理人際關係時得罪了很多同事和領導,讓他們的人際關係陷入一團糟的亂局中
  • 20個常用的JavaScript簡寫技巧
    任何程式語言的簡寫技巧都能夠幫助你編寫更簡練的代碼,讓你用更少的代碼實現你的目標。讓我們一個個來看看 JavaScript 的簡寫技巧吧。 1. 聲明變量 2.