国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題

這篇具有很好參考價(jià)值的文章主要介紹了解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這個(gè)項(xiàng)目是集成了第三方NeteaseCloudMusicApi項(xiàng)目的接口代碼,我沒有直接使用它的接口,因?yàn)樾枰倥芤粋€(gè)npm run開個(gè)端口,感覺很麻煩。

所以下定決心,使用拆分代碼的方式,硬生生將這個(gè)api項(xiàng)目的部分api接口代碼集成到了我自己的項(xiàng)目。當(dāng)然前提是必須能看懂它的代碼,然后才能做拆分,否則你根本無從下手

最后終于都搞定了,這個(gè)過程很復(fù)雜,把它的api代碼拆分到了我自己的項(xiàng)目中。

但是有個(gè)問題,有時(shí)候請求歌曲的時(shí)候會(huì)報(bào)404錯(cuò)誤

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?但是這個(gè)404錯(cuò)誤報(bào)的明顯不正確,因?yàn)槲乙呀?jīng)在代碼里打了埋點(diǎn)

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?上面證明:這個(gè)接口請求實(shí)際已經(jīng)匹配到路由了,所以絕不應(yīng)該是404錯(cuò)誤!

然后排查代碼發(fā)現(xiàn)這個(gè)第三方api的錯(cuò)誤處理代碼居然寫的是404!

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

這就不對(duì)了,肯定起碼應(yīng)該是個(gè)500,但是這還不夠,起碼得知道是什么錯(cuò)誤,

所以,把它的msg的值寫成捕獲到的err

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?本以為這樣處理就應(yīng)該能看到具體的異常信息了,但是實(shí)際返回結(jié)果卻還是空對(duì)象:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?問題變得棘手了,異常明明捕獲到了啊,可是為什么打印不出來呢!

看來首先得看看這個(gè)err的原始信息是什么? 于是在catch代碼塊的開頭先console.log一下這個(gè)err:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

然后這個(gè)異常信息被打印出來了:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲報(bào)錯(cuò)如下:

get Err==> TypeError: Cannot read property 'sort' of undefined
? ? at Object.module.exports [as module] (D:\VueCode\VueProject\myqqmusic\src\registerRouter\NetEaseApi\modules\song_url.js:33:10)
? ? at processTicksAndRejections (internal/process/task_queues.js:93:5)
? ? at async D:\VueCode\VueProject\myqqmusic\src\registerRouter\NetEaseApi\routes.js:69:40
?

?但是為什么把err賦值給msg就取不到值呢,然后斷點(diǎn)調(diào)試看了一下這個(gè)error的數(shù)據(jù)結(jié)構(gòu):

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?然后結(jié)合GPT分析了一下,按理說: 通過err.message和err.stack應(yīng)該可以獲取到異常的具體信息:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?然后確實(shí)看到了異常的具體信息了,這回沒有報(bào)空值{}:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?好了,小結(jié)一下:Javascript中Error對(duì)象必須通過message或者stack屬性來獲取到具體信息,

也就是err.message或者err.stack這種形式,不能把Error對(duì)象直接賦值給變量!??!否則變量獲取的值就是空對(duì)象!

但是這種報(bào)錯(cuò)信息太難看了,應(yīng)該根據(jù)報(bào)錯(cuò)指引,找到異常被觸發(fā)的地方:

get Err==> TypeError: Cannot read property 'sort' of undefined
? ? at Object.module.exports [as module] (D:\VueCode\VueProject\myqqmusic\src\registerRouter\NetEaseApi\modules\song_url.js:33:10)
? ? at processTicksAndRejections (internal/process/task_queues.js:93:5)
? ? at async D:\VueCode\VueProject\myqqmusic\src\registerRouter\NetEaseApi\routes.js:69:40

?根據(jù)上面報(bào)錯(cuò)信息,找到song_url.js第33行:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

這個(gè)地方說result沒有sort屬性,那么result本身極有可能也是個(gè)undefined!

所以非常有必要看看它的父級(jí)res到底是個(gè)什么東西

然后通過斷點(diǎn)調(diào)試可以看到res底下果然沒有data屬性,那么result就必然是個(gè)undefined了,

難怪result.sort會(huì)觸發(fā)Cannot read property 'sort' of undefined異常了

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

而且這里可以看到引發(fā)異常的真實(shí)原因:

// 這個(gè)異常信息是放在res.body里面的

?{
? code: -460,
? message: "網(wǎng)絡(luò)太擁擠,請稍候再試!",
}

?所以在通過res.body.data獲取result之前,要先判斷一下res.body是否有data這個(gè)屬性,

或者說判斷res的返回狀態(tài)是否正常,因?yàn)閮H僅根據(jù)res.body是否有data屬性來判斷返回是否正常有點(diǎn)太片面了

然后,我找了一個(gè)請求成功的例子:

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

可以看到請求成功的時(shí)候:不僅res.body有data屬性,res.body.code還等于200,

所以應(yīng)該增加以下代碼:在res請求失敗的時(shí)候主動(dòng)拋出異常,并將res.body作為異常信息:

if (res.body.code != 200 ) { ? ?

? ? throw new Error(res.body)? ?// 因?yàn)楫惓5脑斍樾畔⑹谴鎯?chǔ)在res.body里面

? }

但是在前面說的外部異常攔截的地方(catch err代碼塊),得到結(jié)果是:msg沒能正確解構(gòu)出異常的信息,顯示的是:?[object Object]

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?關(guān)于這個(gè)問題,我查了很久也查了很多資料,嘗試了很多次,都沒有能夠解決問題。

可以說:這是這次問題排查中難度最大的地方

然后呢,我就嘗試著從chatgpt對(duì)話,希望能找到答案。

最初按照它給的方法試了好幾次,也還是不行。

最后我問了一個(gè)關(guān)鍵的神提問:

你沒懂我意思,比如原始異常的信息是res.body="{"code":-460,"message":"網(wǎng)絡(luò)太擁擠,請稍候再試!"}" ,然后我throw new Error(JSON.stringify(res.body)) 拋出了這個(gè)異常,我問catch的時(shí)候怎么才能把這json格式的異常信息取出來

?然后chatgpt終于給出了正確的回答:

我明白你的問題了。如果你的異常信息是一個(gè)JSON字符串,你可以在catch塊中使用JSON.parse來解析它,以獲取原始的JSON對(duì)象。以下是一個(gè)示例:

try {
  const res = { body: '{"code":-460,"message":"網(wǎng)絡(luò)太擁擠,請稍候再試!"}' };
  throw new Error(JSON.stringify(res.body));
} catch (error) {
  try {
    // 嘗試將異常消息解析為JSON
    const errorData = JSON.parse(error.message);
    console.log("Error code:", errorData.code);
    console.log("Error message:", errorData.message);
  } catch (parseError) {
    // 處理解析JSON失敗的情況
    console.error("Error parsing JSON:", parseError);
  }
}

在這個(gè)示例中,我們首先拋出一個(gè)異常,異常消息是JSON字符串。然后在catch塊中,我們嘗試使用JSON.parse將異常消息解析為JSON對(duì)象,并訪問其中的屬性。如果解析失敗,我們捕獲到解析錯(cuò)誤并進(jìn)行處理。

這樣你就可以獲取到原始的JSON對(duì)象信息了。但要小心處理JSON解析失敗的情況,因?yàn)楫惓O⒉灰欢偸怯行У腏SON字符串。

這里的關(guān)鍵有兩點(diǎn):

1.? 自定義異常信息時(shí): new Error構(gòu)造函數(shù)通常接收一個(gè)字符串作為錯(cuò)誤信息的參數(shù),而不是一個(gè)對(duì)象

如果是接收參數(shù)是對(duì)象必須通過JSON.stringify()方法轉(zhuǎn)換成json字符串

2. 當(dāng)已預(yù)知捕獲的error是json字符串時(shí),那么此時(shí)必須使用JSON.parse()方法把error.message轉(zhuǎn)換成object對(duì)象,否則打印出來的就是[object Object]

?所以,代碼需要這樣修改:

異常主動(dòng)拋出的部分:

? if (res.body.code != 200 ) {

? ? // 注意這里new Error的參數(shù)不能是對(duì)象,而必須是字符串?。?!

? ? // 所以res.body必須通過JSON.stringify轉(zhuǎn)成字符串

? ? throw new Error(JSON.stringify(res.body)) ?

? }

?異常捕獲的地方:

catch (err) {

? ? ? ? ? ? ? ? // 因?yàn)閑rr.message是JSON字符串,必須通過JSON.parse轉(zhuǎn)換成對(duì)象,

? ? ? ? ? ? ? ?// 否則msg: errData賦值時(shí)就會(huì)變成: Error: [object Object]

? ? ? ? ? ? ? ? // 這樣msg就獲取不到值,變成了空值了

? ? ? ? ? ? ? ? const errData = JSON.parse(err.message)? //關(guān)鍵點(diǎn) :必須使用?JSON.parse方法

? ? ? ? ? ? ? ? console.log("Error message:", errData.message);? ? ? ?

? ? ? ? ? ? ? ? console.log("get Err==>", err)

? ? ? ? ? ? ? ? console.log('[ERR]', decode(req.originalUrl), {

? ? ? ? ? ? ? ? ? ? status: err.status,

? ? ? ? ? ? ? ? ? ? body: err.body,

? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? if (!err.body) {

? ? ? ? ? ? ? ? ? ? res.status(500).send({

? ? ? ? ? ? ? ? ? ? ? ? code: 500,

? ? ? ? ? ? ? ? ? ? ? ? data: null,

? ? ? ? ? ? ? ? ? ? ? ? msg: errData, ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? ? ? return

? ? ? ? ? ? ? ? }

問題解決:前臺(tái)msg信息終于正常顯示出來了,不再是[object Object]

解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題,node,axios,異常捕獲

?總結(jié):

1.?Javascript中的Error對(duì)象必須通過message或者stack屬性來獲取到它的具體信息,

也就是err.message或者err.stack這種形式。

不能把整個(gè)Error對(duì)象直接賦值給變量?。。?span style="background-color:#ffd900;">否則變量獲取的值就是空對(duì)象!

2.??自定義異常信息時(shí): new Error構(gòu)造函數(shù)通常接收一個(gè)字符串作為錯(cuò)誤信息的參數(shù),而不是一個(gè)對(duì)象

如果是接收參數(shù)是對(duì)象必須通過JSON.stringify()方法把該對(duì)象轉(zhuǎn)換成json字符串

// 主動(dòng)拋出異常的部分

//?如果是接收參數(shù)是對(duì)象必須通過JSON.stringify()方法把該對(duì)象轉(zhuǎn)換成json字符串

new Error(JSON.stringify(err_obj))

3. 當(dāng)已預(yù)知捕獲的error是json字符串時(shí),那么此時(shí)必須使用JSON.parse()方法把error.message轉(zhuǎn)換成object對(duì)象,否則打印出來的就是[object Object]

// 捕獲異常的部分

catch(err) {

// 當(dāng)已知err是json字符串時(shí),則必須使用JSON.parse()方法把error.message轉(zhuǎn)換成object對(duì)象,否則打印出來的就是[object Object]

? ?errData = JSON.parse(err.message)? // 使用JSON.parse方法是關(guān)鍵!

}文章來源地址http://www.zghlxwxcb.cn/news/detail-718790.html

到了這里,關(guān)于解決node項(xiàng)目一個(gè)極度困難的捕獲異常卻無法讀取異常信息的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【異常解決】vue項(xiàng)目localhost:8080無法訪問此網(wǎng)站或者無法訪問此頁面,localhost拒絕了我們的連接請求

    【異常解決】vue項(xiàng)目localhost:8080無法訪問此網(wǎng)站或者無法訪問此頁面,localhost拒絕了我們的連接請求

    前端頁面使用的是vue,vue項(xiàng)目啟動(dòng)成功,沒有任何報(bào)錯(cuò),服務(wù)控制臺(tái)已出現(xiàn)APP訪問地址,如下圖所示: 點(diǎn)擊訪問地址,瀏覽器打開后頁面先是空白,然后過了一會(huì)兒顯示無法訪問此網(wǎng)站,localhost拒絕了我們的連接請求頁面,信息如下: 出現(xiàn)此問題的原因有以下幾種:請挨個(gè)

    2023年04月25日
    瀏覽(92)
  • Qt中無法捕獲鍵盤按下操作的解決方法

    Qt中無法捕獲鍵盤按下操作的解決方法

    上述代碼片段是控制窗口中 pushButton 按鈕實(shí)現(xiàn) 上下左右移動(dòng)的功能 ;即,當(dāng)按下鍵盤中的W、S、A、D或者↑、↓、←、→鍵時(shí),pushButton按鈕可以隨之進(jìn)行位置變化;運(yùn)行時(shí)發(fā)現(xiàn),按下W、S、A、D可以實(shí)現(xiàn)所需功能,而按下↑、↓、←、→鍵時(shí),按鈕沒有反應(yīng); 這是由于沒有捕

    2024年02月13日
    瀏覽(16)
  • 當(dāng)IDEA加載一個(gè)MAVEN新項(xiàng)目時(shí),加載不成功,無法加載依賴的解決方法

    當(dāng)IDEA加載一個(gè)MAVEN新項(xiàng)目時(shí),加載不成功,無法加載依賴的解決方法

    此文為練習(xí)項(xiàng)目時(shí)的錯(cuò)誤記錄 當(dāng)使用IDEA引入一個(gè)MAVEN新項(xiàng)目時(shí),點(diǎn)擊Reload maven按鈕加載不成功,顯示如下圖界面: 在項(xiàng)目中的代碼顯示報(bào)紅,如下圖: 經(jīng)查閱相關(guān)資料及反復(fù)嘗試,解決方法如下: 進(jìn)入File-Project Structure-Project,確認(rèn)選擇好自己版本的jdk,這里使用的是jdk1.

    2024年01月19日
    瀏覽(107)
  • 【C++】異常處理 ① ( 異常概念引入 | 拋出異常語法 | 捕獲異常語法 | 異常捕獲流程 | 異常處理代碼示例 )

    【C++】異常處理 ① ( 異常概念引入 | 拋出異常語法 | 捕獲異常語法 | 異常捕獲流程 | 異常處理代碼示例 )

    異常是一種 特殊的程序流控制機(jī)制 , 用于處理程序中可能出現(xiàn)的錯(cuò)誤或異常情況 ; 當(dāng)程序執(zhí)行錯(cuò)誤時(shí) , 由 throw 拋出異常 , 并即跳轉(zhuǎn)到相應(yīng)的異常處理程序中 ; 如果沒有適當(dāng)?shù)漠惓L幚沓绦蛱幚碓摦惓?, 程序會(huì)崩潰終止 ; 異常與函數(shù)對(duì)比 : 函數(shù) 是一種 以 棧結(jié)構(gòu) 展開的

    2024年02月04日
    瀏覽(18)
  • 爬蟲異常處理:異常捕獲與容錯(cuò)機(jī)制設(shè)計(jì)

    爬蟲異常處理:異常捕獲與容錯(cuò)機(jī)制設(shè)計(jì)

    作為一名專業(yè)的爬蟲程序員,每天使用爬蟲IP面對(duì)各種異常情況是我們每天都會(huì)遇到的事情。 在爬取數(shù)據(jù)的過程中,我們經(jīng)常會(huì)遇到網(wǎng)絡(luò)錯(cuò)誤、頁面結(jié)構(gòu)變化、被反爬蟲機(jī)制攔截等問題。在這篇文章中,我將和大家分享一些關(guān)于如何處理爬蟲異常情況的經(jīng)驗(yàn)和技巧。通過異常

    2024年02月11日
    瀏覽(17)
  • Java 異常處理以及如何捕獲和處理多個(gè)異常

    Java 異常處理以及如何捕獲和處理多個(gè)異常

    在Java中,我們使用異常處理程序組件try,catch和finally塊來處理異常。 為了捕獲和處理異常,我們將try...catch...finally代碼塊放置在可能產(chǎn)生異常的代碼周圍。finally塊是可選的。 try...catch...finally的語法為: 可能會(huì)生成異常的代碼放在try塊中。 每個(gè)try塊后面應(yīng)緊跟著catch 或 fi

    2024年02月14日
    瀏覽(44)
  • java異常處理機(jī)制(二)之異常處理與捕獲

    java異常處理機(jī)制(二)之異常處理與捕獲

    1 Error(錯(cuò)誤): 是指程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序時(shí)比較嚴(yán)重的問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的操作無關(guān),而表示代碼運(yùn)行時(shí)JVM(Java 虛擬機(jī))出現(xiàn)的問題。 2 異常(Exception): 是指在程序執(zhí)行時(shí)由于程序處理邏輯上的錯(cuò)誤而導(dǎo)致程序中斷的一種指令流。通俗的

    2024年02月05日
    瀏覽(21)
  • Python 異常捕獲與處理

    當(dāng)我們寫程序難免遇到報(bào)錯(cuò),專業(yè)的稱呼叫做異常,行業(yè)俗語叫做bug,由于異常情況出現(xiàn)會(huì)導(dǎo)致代碼停止運(yùn)行,所以在編寫過程中要盡可能避免。 語法錯(cuò)誤 這一類錯(cuò)誤很好理解,相當(dāng)于你不會(huì)寫,比如用if或for的時(shí)候不知道他們怎么寫,這種情況比較夸張了,好好學(xué)過的人都

    2023年04月22日
    瀏覽(24)
  • c++捕獲異常

    catch ?塊跟在? try ?塊后面,用于捕獲異常。您可以指定想要捕捉的異常類型,這是由 catch 后的括號(hào)內(nèi)的異常聲明決定的。 try { // 保護(hù)代碼 }catch( ExceptionName e ) { // 處理 ExceptionName 異常的代碼 } 上面的代碼會(huì)捕獲一個(gè)類型為? ExceptionName ?的異常。如果您想讓 catch 塊能

    2024年02月09日
    瀏覽(22)
  • Java中的異常Exception和捕獲,自定義異常

    Java中的異常Exception和捕獲,自定義異常

    1.1 什么是程序的異常 ?在使用計(jì)算機(jī)語言進(jìn)行項(xiàng)目開發(fā)的過程中,即使程序員把代碼寫得盡善盡美,在系統(tǒng)的運(yùn)行過程中仍然會(huì)遇到一些問題,因?yàn)楹芏鄦栴}不是靠代碼能夠避免的。 異常 :指的是程序在執(zhí)行過程中,出現(xiàn)的非正常情況,如果不處理最終會(huì)導(dǎo)致JVM的非正常停

    2023年04月20日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包