异常处理的重要性
异常处理是我们后端开发人员必须重视的一个东西,这样返回的信息可以让我们明确异常在哪里,可以给前台一个友好的提示。当我们遇到错误,我们会通过异常抛出的信息,来解决问题。
如何抛出异常
我们知道,如果是服务器错误的时候,会自动抛出异常500,这是服务器的默认处理,无论出现什么错误都会抛出同一个错误信息,如何我们主动抛出错误呢。
try{
dosomething
throw error('error')
}
catch(error){
console.log('报错了')
}
复制代码
以上就是我们主动抛出的一个错误
在koa全局捕获错误
我们把整个捕获异常放在中间件里面,这样每一个错误都可以被捕获到。
在middlewares下面建立一个catcherror中间件
// 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,会得到以下结果。
登录错误
复制代码
HttpExctption基类
这样的主动抛出错误,会显得十分麻烦,我们利用面向对象的知识,把异常抛出写成一个类,来继承服务器的error类。
/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.js
// 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)
复制代码
改写中间件
// 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
定时分析技术和资料,欢迎大家进来一起交流。
往期回顾地址: