一个良好的编码习惯必然离不开异常处理,本文将会介绍如何在koa框架下面如何抛出错误,并统一处理返回异常。

正常错误处理

koa是一个优秀的NodeJs web框架,在我们开发web项目的时候,避免不了任何错误处理,包括http错误以及自定义的业务逻辑处理。
在Node.js 中,抛出错误如下

if(someCondition){throw Error("Error");
}

Http错误处理

这里使用ctx.throw(400)的方式,抛出http错误,同时返回一些信息。

ctx.status = 400
ctx.body = {msg: "some params is invalid"
}

此时既返回了状态码,又返回了相关的错误信息。

业务逻辑错误处理

如果需要开发Restful API server,这个时候需要定义若干的业务逻辑错误代码,像下面这样的

code码 说明
0 success
-1 server error
4001 token 过期

这个时候,就需要在业务层中进行处理。

router.get("/", (ctx, next) => {if(tokenExpire(token)){const errcode = ERROR_CODE.TOKEN_EXPIRED;ctx.body = {errcode,msg: ERROR_MSG[errcode]}return}
})

这里,就返回了相关的errcode,通过errcode的方式返回了相关的错误代码

全局捕获异常处理

这里在koa里,全局捕获异常,这里使用中间件的方式,确保异常可以捕获到
在middlewares建立一个catcherror中间件,达到捕获到异常的方式

// middlewares/catcherror.js
const catchError = async(ctx, next) => {try{await next();}catch(error){if(error.errorCode){console.log("捕获到异常")return ctx.body = errror.msg;}}
}
module.exports = catchError

这样定义一个中间件,在中间件进行相关的捕获,确保捕获到相关的异常,并把这个中间件进行导出。

放在next里面,如果next程序出现异常,就可以实现在中间件进行相关的捕获。

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 = 1000;error.msg = "错误";throw error}
})app.use(router.routers())
app.listen(3000)

这个时候,凭借着中间件,可以实现抛出错误异常。

使用基类的方式处理

主动抛出错误,会显示的相当麻烦,这里使用面向对象的方式,继承error类。
把错误信息,放入到error类中,通过放入error类中,实现对错误的直接抛出。

// core/http-exception.jsclass HttpException extends Error{constructor(msg = '服务器异常', errorCode = 1000. 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

这样就完成了一次的改写。

微信公众号

优雅 | koa处理异常相关推荐

  1. java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常

    (一)概述 异常处理是一个系统最重要的环节,当一个项目变得很大的时候,异常处理和日志系统能让你快速定位到问题.对于用户或者接口调用者而言,优雅的异常处理可以让调用者快速知道问题所在.本文将介绍如何优雅 ...

  2. 如何优雅处理前端异常?

    如何优雅处理前端异常? 参考文章: (1)如何优雅处理前端异常? (2)https://www.cnblogs.com/fundebug/p/how_to_handle_frontend_error. ...

  3. 优雅地处理异常真是一门学问啊!

    01.前言 你有没有这样的印象,当你想要更新一款 APP 的时候,它的更新日志里总有这么一两句描述: 修复若干 bug 杀了某程序员祭天,并成功解决掉他遗留的 bug 作为一名负责任的程序员,我们当然 ...

  4. 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?

    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...

  5. [译]Go如何优雅的处理异常

    原文:hackernoon.com/golang-hand- 注:译文中error可以理解为异常,但Go中的error和Java中的异常还是有很大区别的,需要读者慢慢体会,所以为了方便阅读和思考,译文 ...

  6. 如何优雅的处理异常?SpringBoot全局异常与数据校验

    要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后 ...

  7. java退出不报异常_如何优雅的处理异常(java)?

    这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...

  8. @ControllerAdvice实现优雅地处理异常

    @ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理.最常用的 ...

  9. 如何优雅的处理异常(java)

    2019独角兽企业重金招聘Python工程师标准>>> 作者:ylxfc 链接:https://www.zhihu.com/question/28254987/answer/4017 ...

最新文章

  1. spring 定时任务执行两次解决办法
  2. python优秀程序员条件_Python 条件语句
  3. sqlserver2008 获取最后插入的id_Python3操作SQL Server2008数据库
  4. leetcode最大矩形 (动态规划 python)
  5. 就业模拟试题_Java(答案)
  6. 每日程序C语言14-小球反弹高度问题
  7. 2018--Linux命令总结整理复习版
  8. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
  9. Unity3D技术之优化图形性能绘制调用批处理浅析
  10. Android px pt dp sp...
  11. 一本通例题-生日蛋糕——题解超强深搜剪枝,从无限到有限
  12. python中打乱顺序的函数_numpy.random.shuffle打乱顺序函数的实现
  13. 2021-06-17java各种锁
  14. Linux下安装docker详细介绍
  15. pytorch中的 nn.ModuleList 和 nn.Sequential
  16. 互联网平台黑产解密(下)
  17. vue高拍仪拍照后上传服务器回显到Upload(记录)
  18. Linux性能优化(一)——stress压力测试工具
  19. day python calss08 深浅copy
  20. cnpm 淘宝镜像下载安装图文

热门文章

  1. 美国组建半导体工作组或与中国推进海外并购冲突
  2. 11个让你吃惊的 Linux 终端命令
  3. linux AB测试
  4. 委托与事件-闲聊系列(二)
  5. zipimport — Import modules from Zip archives¶
  6. 用css 添加手状样式,鼠标移上去变小手,变小手
  7. linux设备驱动开发专业论坛www.linuxdriver.cn诚征斑竹
  8. 使用ladash判断集合中是否有
  9. java对mysql的简单操作的综合运用——登录+注册+修改密码
  10. 华为云mysql端口号_华为云云耀服务器远程连接mysql,报错10038端口配置问题。