異常處理是咱們後端開發人員必須重視的一個東西,這樣返回的信息能夠讓咱們明確異常在哪裏,能夠給前臺一個友好的提示。當咱們遇到錯誤,咱們會經過異常拋出的信息,來解決問題。html
咱們知道,若是是服務器錯誤的時候,會自動拋出異常500,這是服務器的默認處理,不管出現什麼錯誤都會拋出同一個錯誤信息,如何咱們主動拋出錯誤呢。前端
try{
dosomething
throw error('error')
}
catch(error){
console.log('報錯了')
}
複製代碼
以上就是咱們主動拋出的一個錯誤編程
咱們把整個捕獲異常放在中間件裏面,這樣每個錯誤均可以被捕獲到。後端
在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
登陸錯誤
複製代碼
這樣的主動拋出錯誤,會顯得十分麻煩,咱們利用面向對象的知識,把異常拋出寫成一個類,來繼承服務器的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
定時分析技術和資料,歡迎你們進來一塊兒交流。
往期回顧地址: