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

定时分析技术和资料,欢迎你们进来一块儿交流。

往期回顾地址:

相关文章
相关标签/搜索