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

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

  1. // 旧代码
  2. class HomeController extends Controller {
  3. async buy () {
  4. const request = {};
  5. const config = await ctx.service.trade.buy(request);
  6. // 下单后需要进行一次核对,且不阻塞当前请求
  7. setImmediate(() => {
  8. // 这里的异常无法被捕获到,因为setImmediate跳出异步链
  9. ctx.service.trade.check(request).catch(err => ctx.logger.error(err));
  10. });
  11. }
  12. }
  13. // 新代码
  14. class HomeController extends Controller {
  15. async buy () {
  16. const request = {};
  17. const config = await ctx.service.trade.buy(request);
  18. // 下单后需要进行一次核对,且不阻塞当前请求
  19. ctx.runInBackground(async () => {
  20. // 这里面的异常都会统统被 Backgroud 捕获掉,并打印错误日志
  21. await ctx.service.trade.check(request);
  22. });
  23. }
  24. }

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

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

洋葱模型解释如下:

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

请求先到gqlErrorHandler,再到graphql。

响应先从graphql,再到gqlErrorHandler。

gqlErrorHandler中间件代码参考如下

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

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

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

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

  1. // config.[env].js
  2. exports.onerror = {
  3. all(err, ctx){
  4. // console.log('框架错误拦截',err);
  5. if(ctx.request.url.indexOf('/gql/')>-1 && ctx.response.status !== 200){
  6. // console.log('捕获住了gql错误');
  7. ctx.set({
  8. "Content-Type": "application/json"
  9. });
  10. ctx.status = 200;
  11. ctx.body = JSON.stringify({
  12. data:null,
  13. message:'gql解析错误',
  14. success: false
  15. });
  16. }
  17. else{
  18. ctx.status = 400;
  19. ctx.body = 'error';
  20. }
  21. }
  22. }

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. windows创建虚拟环境

    mkvirtualenv --no-site-packages --python=C:\Python36\python.exe MyCrawler

  2. Django简介,请求生命周期,静态文件配置

    Web框架 ​ Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  3. elastic-job-lite-console后台以服务形式运行

    原文:https://blog.csdn.net/u012637358/article/details/84846923 方式1:命令让程序一直在后台运行 nohup ./bin/start.sh & ...

  4. Pytorch并行计算:nn.parallel.replicate, scatter, gather, parallel_apply

    import torch import torch.nn as nn import ipdb class DataParallelModel(nn.Module): def __init__(self ...

  5. php代理模式(proxy design)

    结构模式最后一个,接着进入行为模式. <?php /* The proxy design pattern functions as an interface to an original obj ...

  6. 项目Beta冲刺(团队)--4/7

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称:葫芦娃队 作业目标:进行新一轮的项目冲刺,尽力完成并完善项目 团队博客 队员学号 队员昵称 博客地址 04160242 ...

  7. 项目Beta冲刺--1/7

    项目Beta冲刺--1/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...

  8. Dockerfile 常见指令的意义/常见的使用方式/使用示例/

    一.什么是 Dockerfile ? Dockerfile 就是生成docker镜像的指令集, 通过使用docker工具执行这些指令集可以方便快捷地生成镜像, 并且能不断复用 Dockerfile 指 ...

  9. Cookies and Custom Protocols

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Cookiesa ...

  10. PHP - register globals

    It seems that the developper often leaves backup files around... 似乎开发人员经常把备份文件放在… 直接下载网站备份: index.ph ...