try-catch在另一个没有异常的情况下的try语句之后

时间:2016-04-12 11:29:12

标签: javascript try-catch

我有一个代码,我必须使用eval() JavaScript函数执行(如果您想讨论是否可以使用eval()函数,请在此处添加信息: Why is using the JavaScript eval function a bad idea?但不要专注于此处)。

在一些代码之后,它使用eval()函数执行,如果它没有在try-catch块上给出任何异常,则此代码将更改,我将不得不再次执行eval()在另一个try-catch块中运行。

问题在于,如果我将一个try-catch块放在另一个上面,它们将一起执行,代码将不会被清除,因此eval()函数将被执行两次。像这样:

var code = some code here;

try{
   eval(code); //Here the code has divs animations
   $("#animate").promise().done(function(){
        checkAnimation();
        //Clear code
   });      
}catch(error){
   console.log(error);
}

try{
   eval(code); //Animations with the same div

   $("#animate").promise().done(function(){
        checkAnimation();
   });  
}catch(error){
   console.log(error);
}

我还看到有一个finally语句,但无论try-catch块是否发生异常都会被执行,因此它对我没用。

我的想法

我认为在清除代码之后我可以包含第二个try-catch块但是我不知道它是否是一个好习惯,因为它在另一个函数内部并且该函数内部的代码也可以生成异常

我的问题

我是否可以仅在第一个try-catch块无效时才执行try-catch块?

编辑:我编辑了我的代码,因为我忘了把它放在我的第二个try-catch我也有动画。

提前致谢!

2 个答案:

答案 0 :(得分:0)

done回调中的任何内容都是a)计划在动画结束后执行,b)因此将独立于外部try..catch块。您需要将要在// clear code a)之后执行的任何代码放入回调中,并将b)放入新的try..catch块中:

try {
    eval(code);
    $("#animate").promise().done(function () {
         try {
             checkAnimation();
             //Clear code
             eval(code);
         } catch (error) {
             console.log(error);
         }
    });      
} catch (error) {
    console.log(error);
}

为了更好地可视化回调独立于第一个try..catch的方式/原因,请将回调写为独立函数而不是内联函数:

try {
    eval(code);
    $("#animate").promise().done(callback);      
} catch (error) {
    console.log(error);
}

function callback() {
     try {
         checkAnimation();
         //Clear code
         eval(code);
     } catch (error) {
         console.log(error);
     }
}

答案 1 :(得分:0)

最后,我解决了以下问题:

var count = 0;

function evaluateCode(){
     try {
        eval(code);

        $("#animate").promise().done(function(){
           if(count == 0){
              checkAnimation1(); //I clear the code inside this function
           }
           else{
              checkAnimation2();
           }

           count++;
        });         
     } catch (e) {
        alert(e);
     }
}

我把这个功能叫了两次。如果我没有这样做,代码永远不会在执行下一个eval(code)之前清除。