koa2笔记(八)全局异常处理

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:47   6269   0

异常处理的重要性

异常处理是我们后端开发人员必须重视的一个东西,这样返回的信息可以让我们明确异常在哪里,可以给前台一个友好的提示。当我们遇到错误,我们会通过异常抛出的信息,来解决问题。

如何抛出异常

我们知道,如果是服务器错误的时候,会自动抛出异常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

定时分析技术和资料,欢迎大家进来一起交流。

往期回顾地址:

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP