优雅 | koa处理异常
一个良好的编码习惯必然离不开异常处理,本文将会介绍如何在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处理异常相关推荐
- java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常
(一)概述 异常处理是一个系统最重要的环节,当一个项目变得很大的时候,异常处理和日志系统能让你快速定位到问题.对于用户或者接口调用者而言,优雅的异常处理可以让调用者快速知道问题所在.本文将介绍如何优雅 ...
- 如何优雅处理前端异常?
如何优雅处理前端异常? 参考文章: (1)如何优雅处理前端异常? (2)https://www.cnblogs.com/fundebug/p/how_to_handle_frontend_error. ...
- 优雅地处理异常真是一门学问啊!
01.前言 你有没有这样的印象,当你想要更新一款 APP 的时候,它的更新日志里总有这么一两句描述: 修复若干 bug 杀了某程序员祭天,并成功解决掉他遗留的 bug 作为一名负责任的程序员,我们当然 ...
- 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?
前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...
- [译]Go如何优雅的处理异常
原文:hackernoon.com/golang-hand- 注:译文中error可以理解为异常,但Go中的error和Java中的异常还是有很大区别的,需要读者慢慢体会,所以为了方便阅读和思考,译文 ...
- 如何优雅的处理异常?SpringBoot全局异常与数据校验
要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后 ...
- java退出不报异常_如何优雅的处理异常(java)?
这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...
- @ControllerAdvice实现优雅地处理异常
@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理.最常用的 ...
- 如何优雅的处理异常(java)
2019独角兽企业重金招聘Python工程师标准>>> 作者:ylxfc 链接:https://www.zhihu.com/question/28254987/answer/4017 ...
最新文章
- spring 定时任务执行两次解决办法
- python优秀程序员条件_Python 条件语句
- sqlserver2008 获取最后插入的id_Python3操作SQL Server2008数据库
- leetcode最大矩形 (动态规划 python)
- 就业模拟试题_Java(答案)
- 每日程序C语言14-小球反弹高度问题
- 2018--Linux命令总结整理复习版
- idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
- Unity3D技术之优化图形性能绘制调用批处理浅析
- Android px pt dp sp...
- 一本通例题-生日蛋糕——题解超强深搜剪枝,从无限到有限
- python中打乱顺序的函数_numpy.random.shuffle打乱顺序函数的实现
- 2021-06-17java各种锁
- Linux下安装docker详细介绍
- pytorch中的 nn.ModuleList 和 nn.Sequential
- 互联网平台黑产解密(下)
- vue高拍仪拍照后上传服务器回显到Upload(记录)
- Linux性能优化(一)——stress压力测试工具
- day python calss08 深浅copy
- cnpm 淘宝镜像下载安装图文
热门文章
- 美国组建半导体工作组或与中国推进海外并购冲突
- 11个让你吃惊的 Linux 终端命令
- linux AB测试
- 委托与事件-闲聊系列(二)
- zipimport — Import modules from Zip archives¶
- 用css 添加手状样式,鼠标移上去变小手,变小手
- linux设备驱动开发专业论坛www.linuxdriver.cn诚征斑竹
- 使用ladash判断集合中是否有
- java对mysql的简单操作的综合运用——登录+注册+修改密码
- 华为云mysql端口号_华为云云耀服务器远程连接mysql,报错10038端口配置问题。