欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS對象類型之Error錯誤對象的用法詳解

 更新時間:2024年04月10日 09:20:49   作者:儒雅的烤地瓜  
error對象是JavaScript的原生對象,當(dāng)程序解析和運行過程中發(fā)生了錯誤,JS引擎就會自動產(chǎn)生并拋出一個error對象的實例,并且程序會終止在錯誤發(fā)生的地方,本文給大家介紹了JS Error錯誤對象的用法,需要的朋友可以參考下

error對象是JavaScript的原生對象,當(dāng)程序解析和運行過程中發(fā)生了錯誤,JS引擎就會自動產(chǎn)生并拋出一個error對象的實例,并且程序會終止在錯誤發(fā)生的地方。

ECMA-262 規(guī)定error對象包含 message 和 name 兩個屬性,message屬性保存錯誤信息,name屬性保存錯誤類型。

可以使用error()構(gòu)造函數(shù)創(chuàng)建一個新的Error錯誤對象,對象接收一個參數(shù)用來表示錯誤信息,error對象會把它作為message屬性的值;如果沒有參數(shù),它將使用一個預(yù)定義的默認(rèn)字符串作為屬性值

new Error()
new Error('錯誤消息')
 
// 可以省略new操作符
Error()
Error('錯誤消息')
 
// 通常使用throw語句來拋出錯誤
throw Error('錯誤消息')
throw Error()

error對象有一個toString()方法。返回'Error' + message屬性值

error類型

ECMA-262 定義了下列7種錯誤類型:

Error()     // 基類型
EvalError()  // eval錯誤
RangeError() // 范圍錯誤
ReferenceError() // 引用錯誤
SyntaxError() // 語法錯誤
TypeError()  // 類型錯誤
URIError() // URI錯誤

Error 是基類型,其他錯誤類型都繼承自該類型,可以利用它拋出自定義錯誤。

以下6種錯誤類型都是Error對象的派生對象。在JavaScript中,數(shù)組array、函數(shù)function都是特殊的對象

EvalError()

eval()函數(shù)執(zhí)行出錯時會拋出EvalError錯誤,該類型在ES5中已不再出現(xiàn),為了向后兼容,所以被保留了下來。

// Uncaught TypeError: eval is not a constructor
new eval()
// 不會報錯
eval = () => {}

RangeError()

RangeError是一個值超過有效范圍時,會拋出RangeError范圍錯誤。例如設(shè)置數(shù)組的長度為一個負(fù)值。

// 數(shù)組長度不得為負(fù)數(shù)
new Array(-1) // Uncaught RangeError: Invalid array length

ReferenceError()

ReferenceError是引用一個不存在的變量或左值時,會拋出ReferenceError引用錯誤

a; // Uncaught ReferenceError: a is not defined

SyntaxError()

SyntaxError是代碼解析時會拋出SyntaxError語法錯誤(語法不符合規(guī)則)。

示例1

var 1bar = 1; // SyntaxError: Invalid or unexpected token

 示例2

function fn() {
    // Uncaught SyntaxError: Unexpected token '}'
    var a = 
}
 
fn();

TypeError()

執(zhí)行某些操作時,類型不符合要求會導(dǎo)致TypeError類型錯誤

null.toString() // Uncaught TypeError: Cannot read property 'toString' of null

URIError()

URIError是指調(diào)用URI相關(guān)函數(shù)的參數(shù)不正確時會發(fā)生URIError錯誤,例如,調(diào)用decodeURI 、encodeURI、decodeURIComponent、encodeURIComponent、escape、unescape時發(fā)生的錯誤。

decodeURI('%2') // Uncaught URIError: URI malformed at decodeURIComponent 

error事件

任何沒有通過 try catch 處理的錯誤都會觸發(fā)window對象的error事件。error事件接收五個參數(shù):

message:錯誤信息(字符串)
source:發(fā)生錯誤的腳本URL(字符串)
lineno:發(fā)生錯誤的行號(數(shù)字)
colno:發(fā)生錯誤的列號(數(shù)字)
error:Error對象(對象)
// 示例1 DOM0級
window.onerror = function(message, source, lineno){
   console.log(message, source, lineno)
}
 
// 示例2 DOM2級
window.addEventListener('error', function(event){
    console.log(event.message, event.source, event.lineno)
});

圖像也支持error事件,當(dāng)圖像src屬性的url不能返回可以識別的圖像格式時,就會觸發(fā)error事件。error事件發(fā)生時圖片下載已結(jié)束。

var img = new Image()
img.src='a.jpg'
img.onerror = function(e) {
  console.log(e)
}

throw語句

throw語句用于拋出錯誤,后面必須指定一個值用來表示錯誤信息,值的類型沒有要求。

參考:throw - JavaScript | MDN

throw 語句用來拋出一個用戶自定義的異常。當(dāng)前函數(shù)的執(zhí)行將被停止(throw之后的語句將不會執(zhí)行),并且控制將被傳遞到調(diào)用堆棧中的第一個catch塊。如果調(diào)用者函數(shù)中沒有catch塊,程序?qū)K止。

throw 'hello world';
 
throw new Error('something bad happened');
 
throw new SyntaxError('I don\'t like your syntax.');
throw new TypeError('what type of variable do you take me for?');
throw new RangeError('sorry,you just don\'t have the range.');
throw new EvalError('That doesn\'t evaluate.');
throw new URIError('URI, is that you?');
throw new ReferenceError('you didn\'t cite your references properly');

可以利用原型鏈繼承Error對象創(chuàng)建自定義錯誤。

function CustomError(message) {
	this.name = 'CustomError'
	this.message = message
}
 
CustomError.prototype = new Error()
throw new CustomError('custom error')

try...catch...語句

try...catch的作用是將可能引發(fā)錯誤的代碼放在try塊中,在catch中捕獲錯誤,對錯誤進(jìn)行處理,選擇是否往下執(zhí)行。

try-catch 語句用于捕獲和處理JavaScript中的異常,try從句定義了可能出現(xiàn)異常的代碼塊,catch從句定義當(dāng)try從句拋出異常時執(zhí)行的代碼。try從句中的任何代碼拋出異常,都會導(dǎo)致代碼終止執(zhí)行,然后執(zhí)行catch中的代碼。

catch從句后面還可以跟finally從句,用于放置清理代碼。無論try從句是否拋出錯誤,finally從句中的代碼都會執(zhí)行。catch和finally都是可選的,但是try從句至少要和其中一個組合成完整的語句。

try {
  // 這里可能會產(chǎn)生錯誤,可能是程序錯誤,可能是throw語句拋出的錯誤
}catch(e) {
  // 當(dāng)try中拋出錯誤時這里才執(zhí)行,變量e包含了錯誤信息
  // 可以根據(jù)錯誤類型處理錯誤,也可以再次拋出錯誤
}finally{
  // 無論try是否拋出異常,這里代碼正常執(zhí)行。即使try中出現(xiàn)return語句。
}
function fn() {
  try {
    console.log(0);
    throw 'bug';
  } catch(e) {
    console.log(1);
    return true;
  } finally {
    console.log(2);
    return false; // 這句會覆蓋掉前面的return
  }
  console.log(3); // 不會運行
}
var result = fn();
// 0
// 1
// 2
 
console.log(result) // false

● try 代碼塊中的錯誤,會被catch捕獲,如果沒有手動拋出錯誤,不會被window捕獲 

try {
  throw new Error('出錯了!');
} catch (e) {
  console.dir(e);
  throw e
}

運行結(jié)果:

注意:在catch中拋出異常, 用 throw e,不要用throw new Error(e),因為e本身就是一個Error對象了(因為在try代碼快中使用throw拋出的 new Error(),是一個使用構(gòu)造函數(shù)new Error()創(chuàng)建的錯誤實例對象),具有錯誤的完整堆棧信息stack,new Error 會改變堆棧信息,將堆棧定位到當(dāng)前這一行。

● try...finally... 不能捕獲錯誤

下面的代碼,由于沒有catch,錯誤會直接被window捕獲。

try {
    throw new Error('出錯啦啦啦')
} finally {
    console.log('啦啦啦')
}

運行結(jié)果:

try...catch...只能捕獲同步代碼的錯誤, 不能捕獲異步代碼錯誤。

下面的代碼,錯誤將不能被catch捕獲

try {
    setTimeout(() => {
        throw new Error('出錯啦!')
    })
} catch(e){
    // 不會執(zhí)行
    console.dir(e)
}

因為setTimeout是異步任務(wù),里面回調(diào)函數(shù)會被放入到宏任務(wù)隊列中,catch中代碼塊屬于同步任務(wù),處于當(dāng)前的事件隊列中,會立即執(zhí)行。當(dāng)setTimeout中回調(diào)執(zhí)行時, try/catch中代碼塊已不在堆棧中,所以錯誤不能被捕獲。

以上就是JS對象類型之Error錯誤對象的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于JS Error錯誤對象用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript幾種彈窗事件的使用

    JavaScript幾種彈窗事件的使用

    這篇文章主要介紹了JavaScript幾種彈窗事件的使用,彈窗事件就是在我們執(zhí)行某操作的時候,彈出信息框給出提示?;蚴占瘮?shù)據(jù)的時候,彈出窗口收集信息,不想收集可以取消隱藏,下文介紹需要的朋友可以參考一下
    2022-02-02
  • 開發(fā)中常用的25個JavaScript單行代碼(小結(jié))

    開發(fā)中常用的25個JavaScript單行代碼(小結(jié))

    這篇文章主要介紹了開發(fā)中常用的25個JavaScript單行代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • ES6中非常實用的新特性介紹

    ES6中非常實用的新特性介紹

    ECMAScript 6離我們越來越近了,作為它最重要的方言,Javascript也即將迎來語法上的重大變革,InfoQ特開設(shè)“深入淺出ES6”專欄,來看一下ES6將給我們帶來哪些新內(nèi)容
    2016-03-03
  • 用js代碼和插件實現(xiàn)wordpress雪花飄落效果的四種方法

    用js代碼和插件實現(xiàn)wordpress雪花飄落效果的四種方法

    這篇文章主要介紹了用js代碼和插件實現(xiàn)wordpress雪花飄落效果的四種方法,需要的朋友可以參考下
    2014-12-12
  • JS實現(xiàn)PC手機端和嵌入式滑動拼圖驗證碼三種效果

    JS實現(xiàn)PC手機端和嵌入式滑動拼圖驗證碼三種效果

    這篇文章主要介紹了JS實現(xiàn)PC手機端和嵌入式滑動拼圖驗證碼三種效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 認(rèn)識延遲時間為0的setTimeout

    認(rèn)識延遲時間為0的setTimeout

    由 John Resig 的 How JavaScript Timers Work 可以知道,現(xiàn)有的 JavaScript 引擎是單線程處理任務(wù)的。它把任務(wù)放到隊列中,不會同步去執(zhí)行,必須在完成一個任務(wù)后才開始另外一個任務(wù)。
    2008-05-05
  • JavaScript 斐波那契數(shù)列 倒序輸出 輸出100以內(nèi)的質(zhì)數(shù)代碼實例

    JavaScript 斐波那契數(shù)列 倒序輸出 輸出100以內(nèi)的質(zhì)數(shù)代碼實例

    這篇文章主要介紹了JavaScript 斐波那契數(shù)列 倒序輸出 輸出100以內(nèi)的質(zhì)數(shù)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • canvas實現(xiàn)愛心和彩虹雨效果

    canvas實現(xiàn)愛心和彩虹雨效果

    本文主要介紹了canvas實現(xiàn)愛心和彩虹雨效果的實例,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 前端實現(xiàn)水印效果的5種方案舉例

    前端實現(xiàn)水印效果的5種方案舉例

    在前端項目中,為了保護(hù)圖片、文檔或其他資源的版權(quán),常常需要為它們添加水印,下面這篇文章主要給大家介紹了關(guān)于前端實現(xiàn)水印效果的5種方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • JS函數(shù)多個參數(shù)默認(rèn)值指定方法分析

    JS函數(shù)多個參數(shù)默認(rèn)值指定方法分析

    這篇文章主要介紹了JS函數(shù)多個參數(shù)默認(rèn)值指定方法,結(jié)合實例形式分析了javascript函數(shù)參數(shù)的定義與傳遞相關(guān)操作技巧,需要的朋友可以參考下
    2016-11-11

最新評論