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. 连接mysql报"ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server"

    最近在服务器上部署好的应用突然间连接不上mysql数据库,报错“ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this M ...

  2. MyBatis的一级缓存、二级缓存演示以及讲解,序列化异常的处理

    MyBatis的缓存机制 缓存就是内存中的一个空间,通常用来提高查询效率 MyBatis支持两种缓存技术:一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭 一级缓存 (1)一级缓存默认开启 ...

  3. ARM处理器基础知识

    1.ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 http://blog.chinaunix.net/uid-28458801-id-3494646.html 2.ARM的7种工作模式. ...

  4. RabbitMQ的使用Demo

    rabbitmq消息队列,官网有六种,实战常用的也就如下五种. 下面开始demo讲解 大致三步:1.配置消息队列,2.生产者提供消息给队列,3.消费者监听消费队列消息 源码下载:https://pan ...

  5. 离线环境下自动化部署python环境(含openssl)

    遇到有项目要在内网环境下安装python项目,所以空余时写了自动化部署python环境和python项目的脚本,由于项目涉密,这里仅提供自动化部署python环境的shell脚本,包括openssl的 ...

  6. Socket网络编程-IO各种概念及多路复用

    Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步  函数或方法被调用的时候,调用者是否得到最 ...

  7. React源码 React.Component

    React中最重要的就是组件,写的更多的组件都是继承至 React.Component .大部分同学可能都会认为 Component 这个base class 给我们提供了各种各样的功能.他帮助我们去 ...

  8. Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

    org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested ...

  9. 安装GO

    1.中文社区 下载地址   https://studygolang.com/dl    选择自己操作系统版本 2.找到适合你系统的版本下载,本人下载的是windows版本.也可以下载Source自己更 ...

  10. es6 -- 与解构赋值默认值结合使用

    参数默认值可以与解构赋值的默认值,结合起来使用. function foo({x, y = 5}) { console.log(x, y) } foo({}) // undefined 5 foo({ ...