2016-04-12 4 views
-2

У меня есть код, который я должен выполнить с eval() функцией JavaScript (Если вы хотите обсудить, нормально ли это или нет, используйте функцию eval(), пожалуйста, добавьте информацию здесь: Why is using the JavaScript eval function a bad idea?, но не сосредотачивайтесь на нем здесь).Try-catch после утверждения try другого, который работал без исключений

После некоторого кода она выполняется с 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 блок работал без исключений?

EDIT: Я отредактировал свой код, потому что забыл положить его во второй try-catch У меня также была анимация.

Заранее благодарен!

+1

Поместите весь второй 'try..catch' внутри вашего' done' callback ...!? – deceze

+0

@deceze, но это будет плохой практикой, как я уже говорил? Потому что функция checkAnimation также может дать исключение. –

+0

Все, что находится внутри обратного вызова 'done', не будет обрабатываться вашим первым блоком' try..catch'! Потому что он выполняется асинхронно. В любом случае вам придется создать совершенно новый независимый блок 'try..catch' внутри этого обратного вызова. – deceze

ответ

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).

0

Все, что находится внутри обратного вызова done, должно быть выполнено после завершения анимации и b) поэтому не зависит от внешнего блока try..catch. Вы должны поместить любой код, который вы хотите выполнить после // clear code а) в функции обратного вызова и б) в новый 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); 
    } 
} 
+0

Я знал, что вы имеете в виду, когда я кладу " Проблема в том, что второй блок try-catch начинается до ... _ ", потому что я изменил свой код, как вы сказали, но проблема в том, что второй' eval (code) 'он выполняется перед строкой ' '// Clear code'" выполняется, поэтому первый код выполняется два раза, по одному в каждой функции 'eval()'. –

+0

Извините, но я забыл поместить это во второй блок try-catch. У меня также есть анимации, поэтому я думаю, что вторая функция '.done()' получает то, что div все еще перемещается, поэтому он выполняется до того, как код будет очищен. Посмотрите мой отредактированный вопрос и жаль снова. –

+0

Ну, да, в вашем коде вы * немедленно * исполняете 'eval' во второй раз. Если вы хотите отложить это выполнение до тех пор, пока первая анимация не закончится и код не будет очищен, ** вам нужно поместить этот вызов 'eval' в асинхронный обратный вызов' done'. ** – deceze