2016-04-12 4 views
-2

Ich habe einen Code, den ich mit eval() Funktion von JavaScript ausführen muss (Wenn Sie diskutieren möchten, ob es in Ordnung ist oder nicht eval() Funktion verwenden bitte Informationen hinzufügen hier: Why is using the JavaScript eval function a bad idea? aber konzentriere dich nicht hier drauf).Try-catch nach Versuch Versuch einer anderen, die ohne Ausnahmen funktioniert

Nach einigem Code mit eval() Funktion ausgeführt wird, und wenn es keine Ausnahme auf dem Block try-catch gibt hat, wird dieser Code ändern und ich werde wieder eval() Funktion in einem anderen try-catch Block auszuführen habe.

Die Probleme kommt, dass, wenn ich ein try-catch Block übereinander legen, werden sie gemeinsam ausgeführt werden und der Code wird nicht sauber sein, so dass die eval() Funktion wird zweimal ausgeführt gehen werden. Wie folgt aus:

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); 
} 

Ich sah auch, dass es eine finally Aussage ist, aber es wird unabhängig davon ausgeführt werden, wenn der try-catch-Block eine Ausnahme gemacht hat oder nicht so ist es für mich nicht sinnvoll.

Was ich denke,

Ich denke, dass ich den zweiten try-catch Block nach dem Löschen des Codes umfassen kann, aber ich weiß nicht, ob es eine gute Übung sein würde, weil es in einer anderen Funktion ist und der Code Innerhalb dieser Funktion kann auch eine Ausnahme generiert werden.

Meine Frage

Kann ich einen try-catch Block nur ausgeführt werden, wenn der erste try-catch Block ohne Ausnahmen gearbeitet hat?

EDIT: Ich habe meinen Code bearbeitet, weil ich vergaß, dass in meinem zweiten try-catch Ich hatte auch eine Animation.

Vielen Dank im Voraus!

+1

Setzen Sie die gesamte zweite "try..catch" in Ihrem "fertig" Callback ...!? – deceze

+0

@deceze aber es wird nicht eine schlechte Praxis sein, wie ich es vorher gesagt habe? Weil die 'checkAnimation' Funktion auch eine Ausnahme geben könnte. –

+0

Alles, was in dem 'Fertig'-Callback ist, wird nicht von Ihrem ersten' Versuch..Catch'-Block behandelt! Weil es asynchron ausgeführt wird. Sie müssen in diesem Callback einen völlig neuen, unabhängigen "try..catch" -Block einrichten. – deceze

Antwort

0

Schließlich löste ich mag es folgt:

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); 
    } 
} 

Und ich rief diese Funktion zweimal. Wenn ich das nicht mache, wird der Code vor der Ausführung des nächsten eval(code) nie gelöscht.

0

Alles, was im Callback done ist, ist a) geplant, nach der Animation zu beenden und b) wird daher unabhängig von der äußeren try..catch Block sein. Sie benötigen einen Code Sie nach // clear code a) in den Rückruf ausführen möchten setzen und b) in einen neuen try..catch Block:

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

besser sichtbar zu machen, wie/warum der Rückruf des ersten try..catch unabhängig ist, schreiben die Rückruf als eigenständige Funktion statt inline:

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

Ich wusste, was du meinst, wenn ich mich setze " _Das Problem ist, dass der zweite try-catch-Block vor ..._ "beginnt, weil ich meinen Code wie gesagt geändert habe, aber das Problem ist, dass der zweite' eval (code) 'vor der Zeile ausgeführt wird" '// Clear code'" es wird ausgeführt, also wird der erste Code zweimal ausgeführt, einer in jeder 'eval()' Funktion. –

+0

Es tut mir leid, aber ich habe vergessen, das in den zweiten "try-catch" -Block zu setzen. Ich habe auch Animationen, also denke ich, dass die zweite '.done()' Funktion es bekommt, dass das div sich immer noch bewegt Es wird ausgeführt, bevor der Code gelöscht wurde. Schau meine bearbeitete Frage und sorry nochmal. –

+0

Nun, ja, in deinem Code wirst du * sofort * eval ein zweites Mal ausführen. Wenn Sie diese Ausführung verzögern möchten, bis die erste Animation beendet ist und der Code "gelöscht" wurde, ** müssen Sie diesen 'eval'-Aufruf in den asynchronen' done' Callback einfügen. ** – deceze