0

使用:

节点.js

问题:

今天在重构我的代码时,我看到了这些行。关于它们的有趣之处在于,try catch 中的每个替代行都可能导致异常,因此代码可能会崩溃。对于我遵循的做法,应该专门处理每个单独的异常,并且最少(有用的)代码行应该在 try catch 中。作为程序员,我应该遵循哪种方法(A、B、其他)?为什么?我个人会选择 A,因为它减少了代码的行数。

代码 A:

function(err, someData, res){
    if(err){
        console.error(err);
    } else{

        try{
            data = JSON.parse(someData); //exception expected

            if(someVariable == "abc"){
                var items = data['a']; //exception expected
            } else if(site == "xyz"){
                var items = data['b']; //exception expected
            }

        } catch(err){
            console.error(err);
        }
}

代码 B:

function(err, someData, res){
    if(err){
        console.error(err);
    } else{

        try{
            data = JSON.parse(someData); //exception expected
        } catch(err){
            console.error(err);
        }

        if(someVariable == "abc"){
            try{
                var items = data['a']; //exception expected
            } catch(err){
                console.error(err);
            }
        } else if(site == "xyz"){
            try{
                var items = data['b']; //exception expected
            } catch(err){
                console.error(err);
        }
            }
}
4

3 回答 3

2

一个扭曲的

“Clean Code”中,“Uncle Bob”Martin 认为尝试/捕获异常是一项值得拥有自己功能的特定任务。将实际工作提取到单独的方法中。这个愚蠢的建议一开始让我咆哮,但我已经成长为真正喜欢这个想法。

parseData = function(someData, res) {
    data = JSON.parse(someData); //exception expected

    if(someVariable == "abc"){
        var items = data['a']; //exception expected
    } else if(site == "xyz"){
        var items = data['b']; //exception expected
    }
}

tryParseData = function(err, someData, res){
    if(err) {
        console.error(err);
    } else {
        try {
            parseData(someData, res);
        } catch(err) {
            console.error(err);
        }
    }
}
于 2013-01-14T20:59:09.683 回答
1

A没问题。

B 不好,因为假设您在 json 解析时出错,即使您知道它不可能成功,它也会继续运行其余代码。更糟糕的是,添加了更多代码,这些代码实际上可能会产生非常奇怪的副作用或难以追踪错误。阅读起来也非常混乱。

您应该将错误捕获分组到逻辑块中,如果一个部分失败并且运行其余部分没有意义,则将其视为一个要捕获的错误块。

于 2013-01-11T12:06:35.620 回答
1

我不认为使用许多 try-catch 块(B) - 每个源代码行一个 - 有任何优势。对代码的每个语义特定部分使用单个 try-catch 块 ( A ),通常是单个方法或代码块,必须以原子方式执行 - 它应该作为一个整体成功或失败。

如果您需要以不同的方式处理不同的异常,请在 catch 块中检查它们:

try
{
  // ...
}
catch(e)
{
  if(e instanceof SpecificError)
  {
    //
  }
}

你也可以分析一下e.message

于 2013-01-11T12:07:05.563 回答