最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node端異常捕獲的實現方法

 更新時間:2022年06月26日 09:14:33   作者:程序媛徐嬋  
本文主要介紹了Node端異常捕獲的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

常見Node報錯處理機制

try catch

try...catch是大家最常用的錯誤處理機制,Javascript語言內置的錯誤處理機制可以在檢測到代碼異常的時候直接進行捕獲并處理。

function test() {
    try {
        throw new Error("error");
    } catch(e) {
        console.log(e);
    } finally {
        console.log("finally");
    }
}
   
test()

一般來說,throw 用于拋出異常,但是單純從語言的角度,我們可以拋出任何值,也不一定是異常邏輯,但是為了保證語義清晰,不建議用 throw 表達任何非異常邏輯。try 語句用于捕獲異常,用 throw 拋出的異常,可以在 try 語句的結構中被處理掉:try 部分用于標識捕獲異常的代碼段,catch 部分則用于捕獲異常后做一些處理,而 finally 則是用于執(zhí)行后做一些必須執(zhí)行的清理工作。catch 結構會創(chuàng)建一個局部的作用域,并且把一個變量寫入其中,需要注意,在這個作用域,不能再聲明變量 e 了,否則會出錯。在 catch 中重新拋出錯誤的情況非常常見,在設計比較底層的函數時,常常會這樣做,保證拋出的錯誤能被理解。finally 語句一般用于釋放資源,它一定會被執(zhí)行,我們在前面的課程中已經討論過一些 finally 的特征,即使在 try 中出現了 return,finally 中的語句也一定要被執(zhí)行。

Node原生錯誤處理機制

大多數Node.js核心API都提供的是利用回調函數處理錯誤,之所以采用這種錯誤處理機制,是因為異步方法所產生的方法并不能簡單地通過try...catch機制進行攔截。

const fs = require('fs');
  
function read() {
    fs.readFile("/some/file/does-not-exist", (err, data) => {
        if(err) {
            throw new Error("file not exist");
        }
        console.log(data);
    });
}
  
read();

Promise

Promise是用于處理異步調用的規(guī)范,由于 JavaScript 特殊的 EventLoop 機制,由 Promise 異步產生錯誤是沒有辦法使用 try...catch 的。

Promise提供的錯誤處理機制,是通過catch方法進行捕獲。

try {
    Promise.reject()
} catch(err) {
    // 這里啥都 catch 不到
    console.log(err)
}

fs.copy(
    buildStatic,
    aresStatic
).then(() => {
    console.log(`${buildStatic} -> ${aresStatic}`)
}).catch(err => {
    // 這里可以捕獲到報錯
    console.log(err)
})

async/await + try catch

async/await語法糖加上try...catch語句進行的。這樣做的好處是異步和同步調用都能夠使用統(tǒng)一的方式進行處理了。

對于異步代碼,建議統(tǒng)一轉換成Promise然后采用async/await + try...catch這種方式進行處理。這樣風格統(tǒng)一,程序的健壯性也大大加強。

async function one() {
    // a未定義
    a.b = 3
}
  
async function test() {
    try {
        await one();
    } catch(error) {
        //  a is not defined
        console.log(error);
    }
}
  
test();

unhandledRejection

實際開發(fā)中,總是會有一些 Promise 被遺漏掉catch處理,沒有得到錯誤處理,會導致應用crash。我們可以通過**unhandledrejection** 事件捕獲未處理的 Promise 錯誤。

實現原理:Node.js 會在每次 Tick 執(zhí)行完后檢查是否有未捕獲的錯誤 Promise,如果有,則觸發(fā) unhandledRejection事件。

process.on('unhandledRejection', (reason, p) => {
    console.log('Unhandled Rejection at:', p, 'reason:', reason);
});

特殊情況如何捕獲異常

如果是回調函數中捕獲異常怎么做?用domain去捕獲,domian捕獲會拋出500錯誤,但是domain捕獲有一個問題,會丟失棧信息,無法保證程序健康進行,所以要結束進程,在回調函數中process.exit(1),然后用node的server.close方法再去釋放,server.close連接釋放后自動結束進程,所以不用在server.close中去結束進程process.exit(1)uncaughtExpection捕獲異常的的原理就是:uncaughtExpection事件存在回調函數process.on("uncaughtExpection",callback)時node不會強制結束進程,這樣可彌補domain丟失stack的問題
所以domian去捕獲絕大部分回調函數中的異常,uncaughtExpection去捕獲丟失stack異常,這樣就完整了

app.use(function(req,res,next){
      var reqDomain = domain.create();
      reqDomain.on("err",function(){
        try {
          var killTimer = setTimeout(function(){
            process.exit(1);
          },1000)
          killTimer.unref();
          server.close();
          res.send(500);
        } catch(e) {
          // statements
          console.log(e.stack);
        }
      })
      reqDomain.run(next);
  });

process.on("uncaughtException",function(err){
  console.log(err);
  try{
    var killTimer = setTimeout(function(){
      process.exit(1)
    },1000)
    killTimer.unref();
    server.close();
  }catch(e){
    console.log(e.stack);
  }
});

uncaughtException

uncaughtException 也是 NodeJS 進程的一個事件。如果進程里產生了一個異常而沒有被任何Try Catch捕獲會觸發(fā)這個事件。

NodeJS 對于未捕獲異常的默認處理是:

    - 觸發(fā) uncaughtException 事件

    - 如果 uncaughtException 沒有被監(jiān)聽

    - 打印異常的堆棧信息

    - 觸發(fā)進程的 exit 事件

所以如果某個報錯沒有被任意try catch捕獲,且沒有定義uncaughtException事件,就會導致程序退出。

process.on('unhandledRejection', (reason, p) => {
    console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)
})

Express錯誤處理

Express中,路由或中間件報錯處理可以通過特殊的中間件來完成。

一般中間件的參數為3個:req,resnext。如果你use一個4個參數的中間件,它將被Express視為錯誤處理中間件。

app.get('/a',function(req,res,next){
    res.end('hahah');
    next(new Error('錯誤啦'));
});
app.use('/a',function(err,req,res,next){
    console.log('路由錯誤'+err);
})
//all error中間件
app.use(function(err, req, res, next) {
    console.log("Error happens", err.stack);
});
//錯誤傳遞,/a的錯誤處理首先匹配/a那個錯誤中間件,如果不用next就不會傳遞到全局錯誤處理中間件
//如果在/a錯誤處理中間件里調用next(err) 那么全局錯誤中間件也會被執(zhí)行

到此這篇關于Node端異常捕獲的實現方法的文章就介紹到這了,更多相關Node 異常捕獲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • nodejs微信開發(fā)之授權登錄+獲取用戶信息

    nodejs微信開發(fā)之授權登錄+獲取用戶信息

    這篇文章主要介紹了nodejs微信開發(fā)之授權登錄+獲取用戶信息,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Node.js 基礎教程之全局對象

    Node.js 基礎教程之全局對象

    這篇文章主要介紹了Node.js 基礎教程之全局對象的相關資料,Node.js 中的全局對象是 global,所有全局變量(除了 global 本身以外)都是 global 對象的屬性,需要的朋友可以參考下
    2017-08-08
  • node環(huán)境執(zhí)行js文件的完整步驟

    node環(huán)境執(zhí)行js文件的完整步驟

    Nodejs下運行JS代碼有兩種方式,一種是在Node.js的交互環(huán)境下運行,另外一種是把代碼寫入文件中,然后用node命令執(zhí)行文件代碼,下面這篇文章主要給大家介紹了關于node環(huán)境執(zhí)行js文件的相關資料,需要的朋友可以參考下
    2023-02-02
  • 在windows上用nodejs搭建靜態(tài)文件服務器的簡單方法

    在windows上用nodejs搭建靜態(tài)文件服務器的簡單方法

    這篇文章主要介紹了在windows上用nodejs搭建靜態(tài)文件服務器的簡單方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Nodejs下DNS緩存問題淺析

    Nodejs下DNS緩存問題淺析

    本文給大家一起探討nodejs下dns的緩存問題,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2016-11-11
  • 簡單了解小程序+node梳理登陸流程

    簡單了解小程序+node梳理登陸流程

    這篇文章主要介紹了簡單了解小程序+node梳理登陸流程,以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • node?NPM庫string-random生成隨機字符串學習使用

    node?NPM庫string-random生成隨機字符串學習使用

    這篇文章主要為大家介紹了node?NPM庫string-random生成隨機字符串學習使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • node.js適合游戲后臺開發(fā)嗎?

    node.js適合游戲后臺開發(fā)嗎?

    這篇文章主要介紹了node.js適合游戲后臺開發(fā)嗎?node.js是不是能代替C++開發(fā)游戲后臺呢?看完本文我想你會有一定的了解了,需要的朋友可以參考下
    2014-09-09
  • 在Node.js中實現文件復制的方法和實例

    在Node.js中實現文件復制的方法和實例

    這篇文章主要介紹了在Node.js中實現文件復制的方法和實例,使用FS模塊實現,需要的朋友可以參考下
    2014-06-06
  • Node調用Java的示例代碼

    Node調用Java的示例代碼

    本篇文章主要介紹了Node調用Java的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

汪清县| 广平县| 县级市| 左贡县| 临海市| 尉氏县| 惠安县| 临安市| 龙井市| 库伦旗| 三江| 河西区| 客服| 张掖市| 福海县| 仁寿县| 甘南县| 西贡区| 平原县| 井陉县| 大渡口区| 韶山市| 丽水市| 皮山县| 长宁县| 西乌珠穆沁旗| 海丰县| 丹东市| 赫章县| 密山市| 开阳县| 平谷区| 韶关市| 宁蒗| 澄江县| 香河县| 富顺县| 当涂县| 西充县| 乌兰浩特市| 区。|