<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Error
: 所有錯誤型別的父類別型;SyntaxError
: 語法錯誤,表示程式的語法使用錯誤;console.log(" "" ") ; // Uncaught SyntaxError: missing ) after argument list
ReferenceError
: 參照錯誤,表示參照的變數不存在;console.log(a); // Uncaught ReferenceError: a is not defined
TypeError
: 型別錯誤,表示使用了錯誤的資料型別let a; console.log(a.name); // Uncaught TypeError: Cannot read properties of undefined (reading 'name') RangeError:範圍錯誤, 資料值不在其所允許的範圍內(函數遞迴呼叫容易出現此錯誤) // 保留小數點多少位 (10.24).toFixed(-1); // toFixed() digits argument must be between 0 and 100 URIError: URI錯誤,向全域性 URI 處理常式(decodeURI、decodeURIComponent)傳遞一個不合法的URI時,URIError 錯誤會被丟擲 // 解碼URI地址 錯誤:格式不正確 console.log(decodeURI("%") ); // URIError: URI malformed
以上都是不同錯誤型別的 Error建構函式,能通過new 建立錯誤物件
捕獲錯誤 try ... catch
try { // 正常書寫的程式程式碼(可能會出錯的程式碼) } catch (err) { // err: try中執行語句發生錯誤時,自動建立err錯誤物件,並將錯誤資訊儲存在物件err中 // 執行錯誤處理 } finally { // 一般用於釋放資源 // finally 可有可無,因為try ... catch 之後的程式碼本來就會執行 }
丟擲錯誤 throw error
通過throw,主動丟擲異常錯誤;
throw new Error("錯誤資訊");
錯誤物件的屬性:
name
屬性: 錯誤型別;message
屬性: 錯誤相關的描述資訊;stack
屬性:函數呼叫棧記錄資訊(錯誤相關資訊,錯誤出現的位置)try{ console.log(a); } catch (err) { console.log(err.name); // ReferenceError console.log(err.message); // a is not defined }
最近在做Node 伺服器端 測試的時候,遇到 打log JSON.stringify(error)為{}的問題,這樣的情況導致根本無法定位到具體問題。
例如:
JSON.stringify()
: 它能夠方便地把一個物件轉化成字串;
但是,它也有一個較大的缺點,就是無法直接處理如Error 這類的物件。
const err = new Error('This is an error') JSON.stringify(err) // '{}'
在控制檯執行上述程式碼後會發現,JSON.stringify() 的結果是一個字串的 "{}",裡面沒有任何有效內容。這是否意味著 JSON.stringify() 確實無法處理 Error 呢?下面我們來看看在 MDN 裡這個函數是如何定義的。
JSON.stringify()將值轉換為相應的JSON格式:
“僅會序列化可列舉的屬性”,是什麼意思呢?眾所周知,在 JS 的世界中一切皆物件,物件有著不同的屬性,這些屬性是否可列舉,我們用 enumerable 來定義.
舉個例子,我們用 obj = { a: 1, b: 2, c: 3 } 來定義一個物件,然後設定它的 c 屬性為“不可列舉”,看看效果會如何:
首先看處理前的效果:
const obj = {a: 1,b: 2,c: 3}; JSON.stringify(obj) // '{"a":1,"b":2,"c":3}'
再看處理後的效果:
const obj = { a: 1, b: 2, c: 3 } Object.defineProperty(obj, 'c', { value: 3, enumerable: false }) JSON.stringify(obj) // => "{"a":1,"b":2}"
可以看到,在對 c 屬性設定為不可列舉以後,JSON.stringify() 便不再對其進行序列化。
我們把問題再深入一些,有沒有辦法能夠獲取一個物件中包含不可列舉在內的所有屬性呢?答案是使用 Object.getOwnPropertyNames() 方法。
依然是剛剛被改裝過的 obj 物件,我們來看看它所包含的所有屬性:
Object.getOwnPropertyNames(obj) // => ["a", "b", "c"]
不可列舉的 c 屬性也被獲取到了!
用同樣的方法,我們來看看一個 Error 都包含哪些屬性:
const err = new Error('This is an error') Object.getOwnPropertyNames(err) // => ["stack", "message"]
可以看到,Error 包含了 stack 和 message 兩個屬性,它們均可以使用點運運算元 . 從 err 範例裡面拿到。
既然我們已經能夠獲取 Error 範例的不可列舉屬性及其內容,那麼距離使用 JSON.stringify() 序列化 Error 也已經不遠了!
JSON.stringify() 可以接收三個引數:
語法:
JSON.stringify(value[, replacer [, space]])
value
replacer
可選space
可選我們來看 replacer 的用法:
……如果該引數是一個陣列,則只有包含在這個陣列中的屬性名才會被序列化到最終的 JSON 字串中……
依然使用上文的 obj 為例子:
const obj = { a: 1, b: 2, c: 3 } Object.defineProperty(obj, 'c', { value: 3, enumerable: false }) JSON.stringify(obj, ['a', 'c']) // => "{"a":1,"c":3}"
可以看到,我們在 replacer 中指定了要序列化 a 和 c 屬性,輸出結果也是隻有這兩個屬性的值,且不可列舉的 c 屬性也被序列化了!守得雲開見月明,Error 物件被序列化的方法也就出來了:
const err = new Error('This is an error') JSON.stringify(err, Object.getOwnPropertyNames(err), 2) // => // "{ // "stack": "Error: This is an errorn at <anonymous>:1:13", // "message": "This is an error" // }"
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45