首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套JSON.parse错误和JS对象遍历错误未被JS try/catch、崩溃服务器捕获

嵌套JSON.parse错误和JS对象遍历错误未被JS try/catch、崩溃服务器捕获
EN

Stack Overflow用户
提问于 2015-08-11 22:33:09
回答 1查看 420关注 0票数 0

我在特快专递里有个邮递员。我担心的是,使用一个大型try/catch块并不能正确地捕获其中发生的所有错误。

在下面唯一的try/catch块中,我尝试访问嵌套的原生JS属性-JS parsed.template.list.push(listItem);

因此,我试图将一个对象推到嵌套属性中的数组上。如果模板不存在,它将导致运行时错误,但这不会被try/catch所捕获,服务器就会完全停止,并且不会发送任何JSON响应。

是否有一种方法来改进我的代码--我是否需要在我的代码中添加大量的尝试/捕获,以试图不自觉地保护所有的东西?

代码语言:javascript
复制
 POST: function (req, res, next) {

            var incidentId = req.body.incident_id;

            if (incidentId) {   
                csDataHelper.getAccountNumWithIncidentCorrelationID(incidentId, function (err, response, body) {

                    if (err) {
                        return res.json({error: err.toString()});
                    }


                    try {  // big try/catch starts here

                        var body = JSON.parse(body);
                        var result = csDataHelper.parseInfoFromCSResponse(body);

                        if (!(result instanceof Error)) {

                            var accountNum = result.accountNum;
                            var homePhone = result.homePhone;
                            var altPhone = result.altPhone;

                            var absPath = path.resolve(nconf.get('globalRoot').concat('/json_response_templates/pay_by_phone.json'));
                            fs.readFile(absPath, 'utf8', function (err, jsonTemplate) {
                                if (err) {
                                    res.json({'error': err.toString()});
                                }
                                else {
                                    var str = jsonTemplate.replace('${accountNumber}', accountNum).replace('${incidentId}', incidentId);
                                    var parsed = JSON.parse(jsonTemplate);
                                    if (homePhone) {
                                        var listItem = {
                                            "label": homePhone,
                                        };
                                        parsed.template.list.push(listItem);
                                    }
                                    if (altPhone) {
                                        var listItem = {
                                            "label": altPhone,
                                        };
                                        parsed.template.list.push(listItem);
                                    }
                                    res.json(parsed);
                                }
                            });
                        }
                        else {
                            return res.send({error: 'no accountNumber sent to Baymax from Contextstore ->' + result});
                        }
                    }
                    catch (err) {
                        return res.json({error: err.toString()});
                    }

                });
            }
            else {
                res.send({error: 'null/empty incident_id posted to Baymax'});
            }
        }
    }

当try/catch中的某些代码发生错误时,该错误不会被try/catch块捕获。具体来说,我知道在某些情况下"parsed.template.list.push(listItem);“实际上应该是"parsed.list.push(listItem);",这取决于JSON的性质。

换句话说,在JS中,在使用嵌套的JSON.parse调用或嵌套的JS对象属性检索时,是否需要使用嵌套的try/catches?

坦率地说,这是相当危险的,在我在Node.js中看到的所有事情中,解析JSON和遍历本地JS对象对服务器正常运行时间构成了一些最大的威胁。

怎样才能对抗这一切?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 04:44:26

它在parsed.template.list.push(listItem)上崩溃的原因是,该行位于异步函数调用的回调内。尝试-捕捉块不会神奇地覆盖回调。

因此,您目前最好的选择是在回调中添加一个尝试捕获,或者添加一个像if (parsed.template && parsed.template.list) { .. }这样的条件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31953142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档