Javascript 节目标准及;重构try/catch语句

Javascript 节目标准及;重构try/catch语句,javascript,node.js,refactoring,Javascript,Node.js,Refactoring,使用: function(err, someData, res){ if(err){ console.error(err); } else{ try{ data = JSON.parse(someData); //exception expected if(someVariable == "abc"){ var items = data['a']; //except

使用:

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);
        }
}
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);
        }
            }
}
node.js

问题:

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);
        }
}
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);
        }
            }
}
今天在重构代码时,我看到了这些大块的行。有趣的是,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);
        }
}
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);
        }
            }
}
代码B:

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);
        }
}
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);
        }
            }
}
A很好

B是不好的,因为假设您在json解析中出错,它将继续运行其余的代码,即使您知道它不可能成功。更糟糕的是,添加了更多的代码,这些代码可能会产生奇怪的副作用,或者很难找到bug。而且读起来非常混乱

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

A可以

B是不好的,因为假设您在json解析中出错,它将继续运行其余的代码,即使您知道它不可能成功。更糟糕的是,添加了更多的代码,这些代码可能会产生奇怪的副作用,或者很难找到bug。而且读起来非常混乱


您应该将错误捕获分组到逻辑块中,如果一个部分出现故障,而运行其余部分没有意义,请将其视为要捕获的一个错误块。

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

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

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

另外,您可能会分析
e.message

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

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

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

此外,您还可能分析带有扭曲的
e.message

A

在《Bob叔叔》一书中,“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);
        }
    }
}

A带扭曲

在《Bob叔叔》一书中,“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);
        }
    }
}