前言:在前一篇文章裡,我們整理總結了asp.net服務端的異常處理。這一篇接著前文,簡單總結並討論一下javascript在用戶端的異常處理。這樣asp.net的服務端和用戶端異常處理我們就都有了初步的認識。
1、煩人的指令碼錯誤
樓豬經常裝13,但是普遍都沒有深度。偶然艱難地看懂了一段英文,終於可以深沉地再裝一回:
代碼
When browsing Web pages on the internet, we all have seen a JavaScript alert box telling us there is a runtime error and asking "Do you wish to debug?". Error message like this may be useful for developers but not for users. When users see errors, they often leave the Web page.
上面這段話,哼哼,看不懂了吧?nc樓豬優雅且粗暴地理解一下就是,開啟一個網頁,我們都不時碰到過網頁彈出腳步錯誤並詢問“是否要調試?”這種sb問題。煩不煩啊,正常使用者經常都會習慣性選擇右上紅叉,但是這種提示資訊可能對開發人員就tmd很有用。由此可見,我kao,開發人員不正常?!看來樓豬理解有誤。其實您不難看出,原文要告訴我們的最終意圖應該是,網頁裡出現指令碼錯誤很要命,使用者體驗不好,白白“嚇跑”一批潛在使用者。
2、如何處理指令碼錯誤
在js中,我們通常也是通過try...catch 來捕獲並處理異常。
try
{
//Run some code here
}
catch(e)
{
//Handle errors here
}
在實際代碼中,我們可能會這麼寫:
代碼
function test(){
var txt="";
try{
alert(aaa);//aaa是未聲明的變數
}
catch(e){
txt="There was an error on this page.\n\n";
txt+="Error message: " + e.message + "\n\n";
txt+="Error description: " + e.description + "\n\n";
txt+="Error name: " + e.name + "\n\n";
//alert(txt);//正式平台上可能需要注釋掉該行
}
}
還有一種比較通用的做法就是,給window對象的onerror事件註冊通用處理方法,並將下面的代碼置於頁面的<head></head>節內:
window.onerror=function(){
return true;
}
上面這種方式的好處是頁面裡寫一次,就不會彈出惱人的指令碼錯誤,有點全域處理的意思。對於開發人員,這種寫法可能會隱藏潛在的指令碼錯誤而不被發現,所以測試的時候需要注釋掉上面的函數。
3、javascript裡的Error
(1)、Error對象的常用屬性
在我們捕獲異常的時候,通常都會在catch處拋出一個Error對象的執行個體e,e的幾個常用屬性如下:
代碼
屬性 說明
description 異常的描述資訊
message 異常的描述資訊
name 異常類型
number 專屬的異常代號
在實際開發中,通常都會提示給開發人員message和name資訊,以便有針對性地處理異常。
(2)、Error對象的類型
通過(1)中的name屬性我們可以查看到異常類型。在js中,有如下幾種常見異常類型:
代碼
TypeError : 當遇到一個意外的類型時引發,比如未聲明的變數等;
SyntaxError : 在解析js代碼時其中的語法錯誤引發,比如服務端註冊腳步,少一個括弧或引號等;
ReferenceError : 使用一個無效的引用時引發該異常;
EvalError : 在錯誤的調用eval函數時引發;
RangeError : 在一個數字型變數的值超出了其範圍時引發;
URIError : 錯誤地使用encodeURI()或decodeURI()函數時引發。
在實際的開發中,針對不同類型的異常作出不同的異常處理,有利於我們有效地發現問題和提高使用者體驗。
最後多說幾句閑話。上周周末休息的時候稍微review了下自己很久以前寫的某一個javascript指令檔。洋洋洒洒幾百行代碼,自以為寫的還是很不錯的,但是竟然沒有看到一個對異常的處理,心頭很沉痛,有種深深的罪惡感(維護這部分代碼的童鞋,當你們在眼花繚亂千姿百態的英文單詞(或它們的簡寫)或亂七八糟的拼音(或它們的簡寫)中穿梭調試時,樓豬虔誠地祝福你們,請你們保重身體啊)。於是故技重施,用“沒有人天生就是十全十美的”來安慰一下自己有點受傷的小心靈,但是依然無法使自己心安理得。多事的樓豬又“老奸巨猾”地問了一下和樓豬住在一起的某位it男,他老人家一邊看電影一邊慢條斯理很不屑地說他從不知道用戶端還可以寫try...catch云云......此言一出,nc樓豬的腦袋裡似乎有一個激動的聲音在呐喊:救星,大救星,很好,非常好,實在是太好了,好不容易終於讓自己的心裡稍微平衡了一下(一不小心又暴露樓豬心裡太陰暗了,面壁去也)。
BTW,現在回想他回答問題的口氣,嗯,漫不經心的,不會是糊弄樓豬,一不小心恰好“故意”安慰樓豬的吧?
今天才是愚人節呢。