1. try catch捕获异步链中的方法

2. ctx.runInBackground(scope)捕获跳出异步链的方法

// 旧代码
class HomeController extends Controller {
async buy () {
const request = {};
const config = await ctx.service.trade.buy(request);
// 下单后需要进行一次核对,且不阻塞当前请求
setImmediate(() => {
// 这里的异常无法被捕获到,因为setImmediate跳出异步链
ctx.service.trade.check(request).catch(err => ctx.logger.error(err));
});
}
} // 新代码
class HomeController extends Controller {
async buy () {
const request = {};
const config = await ctx.service.trade.buy(request);
// 下单后需要进行一次核对,且不阻塞当前请求
ctx.runInBackground(async () => {
// 这里面的异常都会统统被 Backgroud 捕获掉,并打印错误日志
await ctx.service.trade.check(request);
});
}
}

3. 通过中间件拦截上个中间件的异常http code信息拦截

首先eggjs间件机制是一个洋葱模型。

洋葱模型解释如下:

// config.[env].js
exports.middleware = ['gqlErrorHandler','graphql'];

请求先到gqlErrorHandler,再到graphql。

响应先从graphql,再到gqlErrorHandler。

gqlErrorHandler中间件代码参考如下

const NOTFOUND = 404;
const NORMAL = 200; module.exports = () => async function notFoundHandler(ctx, next) {
// console.log('中间件经过');
await next();
// console.log('中间件notFoundHandler错误拦截', ctx.status, ctx.request.url);
if (ctx.status !== NORMAL && ctx.request.url.indexOf('/gql/') > -1) {
ctx.body = { success: false, message: 'gql解析错误', data: null };
ctx.status = NORMAL;
}
if (ctx.status === NOTFOUND) {
ctx.body = { code: NOTFOUND, message: 'Not Found' };
}
};

4. 框架层面的错误统一捕获

如果某个中间件执行异常,会跳过剩下的中间件,直接抛出该异常。

这时需要框架层面的捕获。

// config.[env].js
exports.onerror = {
all(err, ctx){
// console.log('框架错误拦截',err);
if(ctx.request.url.indexOf('/gql/')>-1 && ctx.response.status !== 200){
// console.log('捕获住了gql错误');
ctx.set({
"Content-Type": "application/json"
});
ctx.status = 200;
ctx.body = JSON.stringify({
data:null,
message:'gql解析错误',
success: false
});
}
else{
ctx.status = 400;
ctx.body = 'error';
} }
}

eggjs异常捕获机制的更多相关文章

  1. Javascript的异常捕获机制

    這個異常處理機制,之前也只是,但是沒有怎麼用過,用了一次后發現還可以, 和java,python的異常處理機制也很相似 Javascript的异常捕获机制 1.1 基本的try…catch语句 ES3 ...

  2. struts2 进阶--异常捕获机制

    在SpringMvc中有自己的异常处理机制,struts2当然会有此功能,主要是在struts.xml中配置: <bean type="com.opensymphony.xwork2. ...

  3. C# 异常捕获机制(Try Catch Finally)

    一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,fina ...

  4. C#中的异常捕获机制(try catch finally)

    (转自:http://blog.csdn.net/zevin/article/details/6901489) 一.C#的异常处理所用到关键字try 用于检查发生的异常,并帮助发送任何可能的异常.ca ...

  5. try with resources简洁的异常捕获机制

    通过前篇的<Java文件IO流的操作总结>,我们知道了基本输入输出流的使用方式,但是每次都需要在finally处关闭流资源,这样操作起来既啰嗦又麻烦,有没有更简洁的方式呢?本篇就来讲解jd ...

  6. 异常 Exception 堆栈跟踪 异常捕获 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. gRPC全局异常捕获

    gRPC全局异常捕获 引 一般的.net项目比如ASP.NET.控制台程序.Windows服务.桌面程序等都会有framework自带的全局异常捕获机制.ASP.NET的ExceptionFilter ...

  8. C++异常实现机制

    1.C函数的调用和返回 要理解C++异常机制实现之前,首先要了解一个函数的调用和返回机制,这里面就要涉及到ESP和EBP寄存器.我们先看一下函数调用和返回的流程. 下面是按调用约定__stdcall ...

  9. 使用lua实现try-catch异常捕获

    lua原生并没有提供try-catch的语法来捕获异常处理,但是提供了pcall/xpcall等接口,可在保护模式下执行lua函数. 因此,可以通过封装这两个接口,来实现try-catch块的捕获机制 ...

随机推荐

  1. 安装socketio出现module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 错误

    安装socketio出现module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 错误 执行: pip install --u ...

  2. Css3动画(一) 如何画3D旋转效果或者卫星围绕旋转效果

    如何画3D旋转效果或者卫星围绕旋转效果,当然这个也是工作中的一个任务,我在网上翻了一下,并没有找到类似的东西,所以写下来还是费了一番功夫,因此我把它拿出来记录一下,当然替换了一部分内容.好了,话不多说 ...

  3. redis中获取不同自增数的方法

    项目需求,需要获取不同的自增数,然后与其他信息拼接成一个字符串作为编号,这边有一种基于数据库的获取自增数的方法,这边略过,还有一种基于redis的实现. 此方法可以用到redis的自增函数 publi ...

  4. mysql显示一张表的索引

    show index from tm_show.fulfillment_order;show index from tm_show.express_verify;show index from tra ...

  5. 无法打开jetbrains官网

    找到下面hosts文件,用记事本打开,删除关于jetbrain的文字 需要管理员权限才能操作这个文档: 先后输入cmd和 notepad hosts 删除掉关于jetbrains的模块,再次访问htt ...

  6. 关于Discuz x3.3页面空白解决方法

    今天找时间分析了一下,找到了页面空白的原因,可能是因为php版本兼容性的问题所致,所以只是部分用户遇到这种情况,这里分享一下.经过分析发现是sourcefunctionfunction_core.ph ...

  7. python基础语法3 元组,字典,集合

    元组: ========================元组基本方法===========================用途:存储多个不同类型的值定义方式:用过小括号存储数据,数据与数据之间通过逗号 ...

  8. java 的枚举变量只能使用枚举常量来初始化--带有关联数据的枚举

    public enum ResultEnum { SUCCESS("200","成功"), FAILURE("500","发生异常 ...

  9. Angular vs React---React-ing to change

    这篇文章的全局观和思路一级棒! The Fairy Tale Cast your mind back to 2010 when users started to demand interactive ...

  10. ubuntu及Cenos国内镜像下载

    打开:https://man.linuxde.net/download/ CentOS 7提供了三种ISO镜像文件的下载: DVD ISO 标准安装版,一般下载这个就可以了(推荐) Everythin ...