什么是異常,異常就是我們在編寫Javascript程序時出現(xiàn)的一些錯誤,并會在控制臺中拋出這個錯誤,出現(xiàn)異常其實并不是一件壞事,相對的呢它可以提醒我們開發(fā)人員哪里出現(xiàn)了錯誤,方便我們后續(xù)的修改,能讓我們的代碼更加的流暢絲滑的運行,如果你對程序異常還不了解,看完該篇會讓你對異常有一個初步的了解,也能在出現(xiàn)異常時做出相應的處理。
目錄
1.異常的分類
?2.異常的執(zhí)行流程
?3.捕獲異常
?4.手動拋出異常
?5.總結
1.異常的分類
在Javascript中,異常通常表現(xiàn)為一個對象,不同的對象表達了不同的異常類型,不同類型的異常對應著不同的錯誤。
異常類型 | 含義 |
SyntaxError?? | 語法錯誤 |
ReferenceError | 引用錯誤,使用了不存在的變量或函數(shù) |
TypeError | 類型錯誤,往往是使用了一個對象中不存在的成員? |
RangeError | 范圍錯誤,通常在操作超出有效范圍時發(fā)生,如數(shù)組訪問超出邊界 |
URIError | URI錯誤,通常發(fā)生在encodeURI()或者decodeURI()等方法時給出無效的URI時發(fā)生 |
EvalError | eval錯誤,通常在eval()函數(shù)中執(zhí)行代碼時發(fā)生錯誤 |
InternalError | 內部錯誤,通常發(fā)生在Javascript引擎內部發(fā)生錯誤導致 |
舉幾個常見的錯誤類型的例子
1.語法錯誤
const user = [name: 'zs', age: 18]
我上面的這段代碼是一個很明顯的語法錯誤,錯把數(shù)組當成了對象來存儲數(shù)據(jù),這時候控制臺就會報語法錯誤的提示
?2.引用錯誤
function get() {
console.log(111);
}
set()
我這段代碼定義了一個get()函數(shù),但是我們調用的是set()方法,看控制臺的報錯信息
?3.類型錯誤
let arr = { name: '111' }
arr.push(222)
?我這里定義了一個對象,但是后續(xù)調用了push()方法,這個方法只有數(shù)組才有的,所以此時就會報這個類型錯誤
?其實呢,所有的錯誤都是以對象形式存在的,比如我們也可以自定義一個錯誤,并將其打印出來
let err = new TypeError('arr.push is not a function')
console.error(err);
控制臺也會輸出相應的錯誤
?2.異常的執(zhí)行流程
當代碼在執(zhí)行過程中遇到了錯誤,會發(fā)生什么事情?
1.自動創(chuàng)建對應的異常對象,拋出錯誤
2.程序終止運行,我們知道js代碼是從上到下依次運行的,如果前面出現(xiàn)錯誤,后面的代碼也就不會執(zhí)行了
3.控制臺會顯示異常對象,異常對象中包含了二個信息:程序異常的類型和原因,以及會描述出程序異常出現(xiàn)的位置
看下面這個例子
function A() {
console.log('start A');
B()
console.log('end A');
}
function B() {
console.log('start B');
C()
console.log('end B');
}
function C() {
console.log('start C');
let a;
console.log(a.name); //這里會出現(xiàn)錯誤
}
A()
console.log('程序執(zhí)行完畢');
初步分析我們可以知道 a.name這是一個典型的類型錯誤,a并不像一個對象
控制臺信息:
?可以很清楚的看到代碼并沒有執(zhí)行完就終止了,因為中途遇到了錯誤導致的
報錯信息也很詳細的告訴了我們程序出錯的原因,以及它出現(xiàn)的位置,并且這個報錯信息會將有關的成員全部牽扯進來,最終的錯誤原因是因為在C()函數(shù)中的第52行,間接原因是B()中調用了C(),A()中調用了B(),總路線中出現(xiàn)的錯誤在54行,很清楚的描述了錯誤信息。
?3.捕獲異常
捕獲異常說白了就是去捕獲在代碼運行時可能會發(fā)生錯誤的代碼,然后對其做出一些處理,讓我們的代碼能夠完全執(zhí)行完,不至于報錯后就停止運行了。
利用try catch捕獲異常?
看下面的代碼
try {
console.log("try 開始");
console.log(a.name); //這里會出現(xiàn)錯誤,進行捕獲
console.log("try 結束");
} catch (err) {
console.log("catch 開始");
console.log(err.message); //錯誤提示
console.log("catch 結束");
} finally { //無論是否發(fā)生錯誤都會執(zhí)行
console.log("整個程序結束");
}
這是運行結果
?從結果我們就能看出來try catch的執(zhí)行流程了,首先運行try中的代碼,只要發(fā)生了錯誤就是捕獲錯誤,運行catch中的代碼,并能從err.message中捕獲到錯誤信息,并且整個代碼都可以執(zhí)行完畢,并不是出現(xiàn)停止運行的情況。
?其實在絕大多數(shù)情況下我們是不需要捕獲異常的,畢竟寫好的代碼怎么可能無緣無故報錯呢,一般都是跟一些業(yè)務場景結合才會使用捕獲異常
首先是我們提前就能預知某段代碼會出現(xiàn)異常,比如網(wǎng)絡請求,出現(xiàn)錯誤的情況,用戶在斷網(wǎng)的情況下
然后就是我們必須要確定出現(xiàn)異常后該做些什么事情,就比如用戶斷網(wǎng)了,我們捕獲錯誤后應該提醒用戶
?4.手動拋出異常
它的語法是這樣的,錯誤的類型我們可以隨便定義
throw new TypeError('這是一個類型錯誤')
這是控制臺的報錯
?什么時候會用到手動拋出錯誤
1.可以預知某段代碼可能會發(fā)生錯誤
2.瀏覽器不會自動拋出該錯誤
3.該函數(shù)無法處理這個錯誤
下面是一個例子:
//這是一個求和的函數(shù)
function sum(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new TypeError('傳入的參數(shù)必須是數(shù)字')
}
return a + b
}
let s = sum(1, '2')
這是一個求和的函數(shù),并且我們規(guī)定傳入的參數(shù)必須是整數(shù),但是執(zhí)行此函數(shù)瀏覽器并不會報錯,這時候我們就可以手動的拋出這個錯誤來提醒開發(fā)者
?5.總結
1.對于異常的知識,大概要知道基本的錯誤類型有哪些,這樣在寫代碼,調試代碼時能更快的找出程序的錯誤
2.要能夠根據(jù)錯誤信息迅速的反應過來是什么錯誤,并能找到錯誤的代碼行
3.要知道捕獲異常的語法以及捕獲異常的時機
4.會在適當?shù)臅r機手動拋出錯誤文章來源:http://www.zghlxwxcb.cn/news/detail-606504.html
希望此文對你了解異常的知識能有所幫助文章來源地址http://www.zghlxwxcb.cn/news/detail-606504.html
到了這里,關于Javascript程序異常處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!