当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何优雅地细粒度管理错误捕获?

陶和歌
2024-06-26

如何优雅地细粒度管理错误捕获?

比如我有下面这段代码

async function xxx() {    const result1 = await getInfo1()         const result2 = await getInfo2(paramsBasedResult1)    ... }

错误捕获?

async function xxx() {    try {        const result1 = await getInfo1()         try {            const result2 = await getInfo2(paramsBasedResult1);            ....        }catch(error) {            ...        }    }catch(error) {        ....    }}

一层套一层给我感觉就像是回调地狱。

以我这段代码为例(下面是我做的错误处理的方式,可以将try catch去掉,去实现你自己的错误捕获处理)

async function loadChart() {  // 1. 获取管理区代码  // 2. 拼接管理区代码,发送请求  // 3. 处理数据  //  option.xAxis.data = []  option.series = []  try {    const params1 = {      gs_id: 'xxNnrViL4f',      p_id: 'xxNnrViL4f'    };    const result1 = await getOrgTree(params1);    if (!result1.isSucceed) throw new Error(result1.errMsg);    try{      const mergeGlqdm = result1.data[0].datas.reduce((pre, cur) => pre + "," + cur.code, "").slice(1);      const params2 = {        glqdm: mergeGlqdm,        xmdm: props.xmdm,        ksrq: props.ksrq,        jsrq: props.jsrq      }      const result2 = await getChartData(params2);      if (!result2.isSucceed) throw new Error(result2.errMsg);      const data = result2.data[0].datas;      let preRq = "9999-99-99";      let isCollectAllDate = false;      for (const item of data) {        if (item.rq > preRq) {          option.series[option.series.length - 1].data.push(item.zbz);        } else {          option.series.push({            data: [item.zbz],            type: "line",            name: `系列${option.series.length + 1}`          })          if (preRq !== "9999-99-99") {            isCollectAllDate = true;          }        }        if (!isCollectAllDate) option.xAxis.data.push(item.rq);        preRq = item.rq;      }      myChart.setOption(option);    }catch(error) {      ElMessage.error("获取曲线数据失败,错误信息:" + error.message)    }  }catch(error) {    ElMessage.error("获取分管理区数据失败,错误信息:" + error.message);  }}

共有2个答案

陆斌
2024-06-26

可以试试这个库:await-to-js

示例:

import to from 'await-to-js';// If you use CommonJS (i.e NodeJS environment), it should be:// const to = require('await-to-js').default;async function asyncTaskWithCb(cb) {     let err, user, savedTask, notification;     [ err, user ] = await to(UserModel.findById(1));     if(!user) return cb('No user found');     [ err, savedTask ] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));     if(err) return cb('Error occurred while saving task');    if(user.notificationsEnabled) {       [ err ] = await to(NotificationService.sendNotification(user.id, 'Task Created'));       if(err) return cb('Error while sending notification');    }    if(savedTask.assignedUser.id !== user.id) {       [ err, notification ] = await to(NotificationService.sendNotification(savedTask.assignedUser.id, 'Task was created for you'));       if(err) return cb('Error while sending notification');    }    cb(null, savedTask);}async function asyncFunctionWithThrow() {  const [err, user] = await to(UserModel.findById(1));  if (!user) throw new Error('User not found');  }
沈博达
2024-06-26
async function xxx() {    const result1 = await getInfo1().catch(e=>{         console.log(e);         return null    })    if(!result1) return    const result2 = await getInfo2(paramsBasedResult1).catch(e=>{         console.log(e);         return null    })    ... }
 类似资料:
  • 问题内容: 有没有办法清理此(IMO)恐怖代码? 具体来说,我在谈论错误处理。能够一次性处理所有错误将是很好的。 问题答案:

  • 让我们假设我们有这样一个用python编写的琐碎守护进程: 我们使用< code>start-stop-daemon对其进行守护,默认情况下,它会在< code> - stop上发送< code > SIGTERM (< code > TERM )信号。 假设当前执行的步骤是。此时我们正在发送信号。 发生的情况是执行立即终止。 我发现我可以使用<code>signal.signal(signal.

  • 问题内容: 假设我们有一个用python编写的琐碎守护程序: 我们将它守护起来,默认使用它发送信号–。 假设当前执行的步骤是。此时此刻,我们正在发送TERM信号。 发生的情况是执行立即终止。 我发现我可以使用处理信号事件,但事实是它仍然会中断当前执行并将控制权传递给。 因此,我的问题是-是否可以不中断当前执行,而是TERM在单独的线程(?)中处理信号,以便能够进行设置,从而有机会优雅地停止运行?

  • 人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。经理不会去理解这些东西,因为不好的文档会给他们错误的安全感以至于他们不敢依赖他们的程序员。如果一些人绝对坚持你真的在写没用的文档,就告诉他们“是的”,然后安静的找一份更好的工作。 没有其他事情比精确估计 把好的文档转为放松文档要求的估计 更为有效率。真相是冷酷而艰难的:文档,就像测试,会花比开发代码多几倍的时间。

  • 许多网站建议在停止水槽代理时使用kill -9。 然而,当我用kill-9停止代理时,HDFS接收器文件将永远保持打开状态(如*.tmp)。

  • 让我们假设我们有这样一个用java编写的普通守护进程: 我们使用 来守护它,默认情况下,它会在 上发送 (TERM) 信号 假设当前执行的步骤是#2,此时我们正在发送项信号。 发生的情况是执行立即终止。 我发现我可以使用<code>addShutdownHook()</code>处理信号事件,但问题是它仍然会中断当前的执行,并将控制传递给处理程序: 所以,我的问题是——有没有可能不中断当前的执行,

  • 问题内容: 当用作标题时,如果地址(文件路径)不存在,如何捕获错误? 我完成了一个的内部,有点像这样: ContentCtrl : ContentView : 当我使用addr不存在:/ home /#/ content / profile_asdfa时,角度只是在循环中获取资源。因此,当哈希中没有模板文件时,我需要捕获ng-include错误。有谁能够帮我 ?谢谢! 问题答案: 在源代码中查找n

  • 问题内容: 我在Python中构建了一个简短的url转换器引擎,并且看到大量的“管道破损”错误,并且很好奇在使用BaseHTTPServer类时如何最好地捕获它。这不是全部代码,但可以让您大致了解我目前正在做什么: 该代码本身运行良好,但是在生产中几乎立即开始引发错误: 这些错误的大部分似乎源于在调用send_header()方法时遇到的问题,其中我要写的是: 所以我很好奇在我的代码中尝试捕获此I