2017-06-01 5 views
0

Das folgende Skript ermöglicht es Ihnen, ein Stück JavaScript-Code auszuführen. Fehler werden vom try/catch-Block abgefangen.Wo CATCH eine AUSNAHME in einem EVAL geworfen wird

try { 
     var result = eval(script); 
    } catch (e) { 
     // do something meaningful 
    } 

Wenn jedoch die Variablen script zum Beispiel enthält einen AJAX-Aufruf, und der Ajax-Aufruf löst eine Ausnahme (zB in der Erfolgsfunktion), diese Ausnahme wird von dieser try/catch-Block abgefangen werden ...

// execute an AJAX request 
     var script = '$.ajax(url:"/somewhere", success: function(){throw new MyException('testexception')})'; 
    try { 
     var result = eval(script); 
    } catch (e) { 
     // will not be triggered... 
    } 

Frage: wie kann ich die Ausnahme innerhalb des ajax-Request geworfen zu fangen?

+0

Abgesehen von nicht mit 'eval' überhaupt, auch wenn Sie es nicht verwenden waren, und Sie mussten diese Funktion in einem' try/catch' Block, würde es nicht fangen Ausnahme von der "Erfolg" -Funktion, weil es ein Rückruf ist. Dieser Code wird erst aufgerufen, nachdem Sie Ihren 'try/catch' verlassen haben. –

+0

Ist das nicht das Hinzufügen eines Fehler-Callbacks in der Ajax-Anfrage? – Huangism

+0

@MattBurland 100% einverstanden - aber das ist meine Frage ... – itsame69

Antwort

1

Ich hoffe, Sie sind sich der Gefahren der Verwendung von eval bewusst, und wenn nicht gibt es viele gute Artikel da draußen, die erklären, warum es keine gute Idee ist.

Das Problem ist, dass der Erfolg Callback nach dem catch-Block aufgerufen wird. Sie müssen entweder den Block try/catch innerhalb des Erfolgsrückrufs hinzufügen, oder Sie müssen den Fehler aus einer globaleren Perspektive behandeln. Eine Idee, die ich mir vorstellen kann, ist das Ereignis window.onerror. Ich habe ein Beispiel unten, das etwas ähnliches zu Ihrem Problem zeigt, und eines, das zeigt, dass Sie Fehler finden können, die in eval geworfen werden.

(function() { 
 

 
    'use strict'; 
 

 
    window.addEventListener('error', e => console.log(`window.onerror: ${e.message}`)); 
 

 
    let script = `setTimeout(function() { 
 
    throw new Error('Whoops!'); 
 
    }, 0);`; 
 

 
    eval(script); 
 

 
    script = `throw new Error('Whoops!');`; 
 

 
    try { 
 
    eval(script); 
 
    } catch (e) { 
 
    console.log(e.message); 
 
    } 
 

 
})();

+0

thx viel dafür! – itsame69

Verwandte Themen