koa2筆記(八)全局異常處理

異常處理的重要性

異常處理是咱們後端開發人員必須重視的一個東西,這樣返回的信息能夠讓咱們明確異常在哪裏,能夠給前臺一個友好的提示。當咱們遇到錯誤,咱們會經過異常拋出的信息,來解決問題。html

如何拋出異常

咱們知道,若是是服務器錯誤的時候,會自動拋出異常500,這是服務器的默認處理,不管出現什麼錯誤都會拋出同一個錯誤信息,如何咱們主動拋出錯誤呢。前端

try{
    dosomething
    throw error('error')
}
catch(error){
    console.log('報錯了')
}
複製代碼

以上就是咱們主動拋出的一個錯誤編程

在koa全局捕獲錯誤

咱們把整個捕獲異常放在中間件裏面,這樣每個錯誤均可以被捕獲到。後端

在middlewares下面創建一個catcherror中間件bash

// middlewares/catcherror.js
const catchError = async (ctx,next)=>{
        try{
            await next()
        } catch(error){
            if(error.errorCode){
                console.log('捕獲到錯誤')
                return ctx.body = error.msg
            }
        }
    }
}

module.exports = catchError
複製代碼

這樣咱們就經過監聽next(),若是下一個中間間出現錯誤咱們就能夠捕獲到錯誤,咱們能夠在咱們知道哪裏可能出現錯誤,主動拋出一個錯誤,設置錯誤的errorCode類型,而後根據errorCode來判斷錯誤類型。服務器

const koa = require('koa')
const Router = require('router')
const app = new koa()
const router = new Router()
const catchError = require('./middlewares/catcherror')

app.use(catchError) //必定要放在第一個中間件

router.get('/login',(ctx,next)=>{
    const path = ctx.request.query
    
    // 咱們主動拋出一個錯誤
    if(true){
        const error = new Error()
        error.errorCode = 10000
        error.msg = '登陸錯誤'
        throw error
    }
    
})

app.use(router.routes())
app.listen(3000)
複製代碼

咱們訪問 localhost:3000/login,會獲得如下結果。session

登陸錯誤
複製代碼

HttpExctption基類

這樣的主動拋出錯誤,會顯得十分麻煩,咱們利用面向對象的知識,把異常拋出寫成一個類,來繼承服務器的error類。app

/core/http-exception.js

class HttpException extends Error{
    constroctor(msg='服務器異常',errorCode=10000,code=400){
        super()
        this.msg = msg
        this.code = code
        this.errorCode = errorCode
    }
}
module.export = HttpException
複製代碼

改寫app.jskoa

// app.js
const koa = require('koa')
const Router = require('router')
const app = new koa()
const router = new Router()
const {HttpException} = require('../core/http-exception')
const catchError = require('./middlewares/catcherror')

app.use(catchError) //必定要放在第一個中間件

router.get('/login',(ctx,next)=>{
    const path = ctx.request.query
    
    // 咱們主動拋出一個錯誤
    if(true){
        const error = new HttpException('登陸錯誤',10000,500)
        throw error
    }
})

app.use(router.routes())
app.listen(3000)
複製代碼

改寫中間件async

// middlewares/catcherror.js
const {HttpException} = require('../core/http-exception')
const catchEoore = async (ctx,next)=>{
        try{
            await next()
        } catch(error){
            if(error instanceof HttpExcetion){
                return ctx.body = error.msg
            }
        }
    }
}

module.exports = catchError

複製代碼

以上就是全局異常處理的大體流程,全文是根據慕課網七月老師的講解寫出來的。七月老師的編程思想真的不錯,建議你們有空能夠去慕課網看看。我直接貼出來啦。 傳送門

小強前端交流羣QQ羣:724179055

定時分析技術和資料,歡迎你們進來一塊兒交流。

往期回顧地址:

相關文章
相關標籤/搜索