Domanda

Questo potrebbe essere un po 'difficile da seguire.

Ho una funzione all'interno di un oggetto:

f_openFRHandler:    function(input) {
            console.debug('f_openFRHandler');
            try{
                //throw 'foo';
                DragDrop.FileChanged(input);
                //foxyface.window.close();
            }
            catch(e){
                console.error(e);
                jQuery('#foxyface_open_errors').append('<div>Max local storage limit reached, unable to store new images in your browser. Please remove some images and try again.</div>');
            }
        },

all'interno del blocco try chiama:

this.FileChanged = function(input) {
            // FileUploadManager.addFileInput(input);
            console.debug(input);
            var files = input.files;
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                if (!file.type.match(/image.*/)) continue;

                var reader = new FileReader();
                reader.onload = (function(f, isLast) {
                    return function(e) {
                        if (files.length == 1) {
                            LocalStorageManager.addImage(f.name, e.target.result, false, true);
                            LocalStorageManager.loadCurrentImage();
                            //foxyface.window.close();
                        }
                        else {
                            FileUploadManager.addFileData(f, e.target.result); // add multiple files to list
                            if (isLast) setTimeout(function() { LocalStorageManager.loadCurrentImage() },100);
                        }
                    };
                })(file, i == files.length - 1);
                reader.readAsDataURL(file);
            }
            return true;

LocalStorageManager.addImage chiama:

this.setItem = function(data){
                localStorage.setItem('ImageStore', $.json_encode(data));
        }

localStorage.setItem genera un errore se è stato usato troppo di archiviazione locale. Voglio prendere tale errore di f_openFRHandler (primo esempio di codice), ma è di essere inviato al console di errore invece del blocco catch. Ho provato il seguente codice nella mia console Firebug per assicurarsi che io non sono pazzo e funziona come previsto, nonostante molti livelli di funzione di nidificazione:

try{
    (function(){
        (function(){
            throw 'foo'
        })()
    })()
}
catch(e){
    console.debug(e)
}

Tutte le idee?

È stato utile?

Soluzione

var reader = new FileReader();
                reader.onload = (function(f, isLast) {

Probabile che il tuo problema proprio lì - il FileReader probabilmente chiama onload in modo asincrono, in un momento in cui il tuo try / catch non è più portata. Ci può essere una funzione gestore di errori separata disponibile sull'interfaccia FileReader, o potrebbe essere necessario spostare il try / catch in funzione anonima si sta passando a OnRead ().

Altri suggerimenti

Credo che il problema è che l'errore sta accadendo più tardi, dopo la funzione f_openFRHandler è stata completata. Si noti che la funzione in cui viene chiamato LocalStorageManager.addImage viene impostata come il gestore di onload sul lettore, non essendo chiamato immediatamente. Esso viene chiamato più tardi, in modo asincrono, quando i dati vengono caricati.

Avrete bisogno di mettere il vostro try..catch all'interno della funzione anonima viene creato e assegnato a quell'evento, per esempio:.

this.FileChanged = function(input) {
    // FileUploadManager.addFileInput(input);
    console.debug(input);
    var files = input.files;
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        if (!file.type.match(/image.*/)) continue;

        var reader = new FileReader();
        reader.onload = (function(f, isLast) {
            return function(e) {
                try {       // ADDED
                    if (files.length == 1) {
                        LocalStorageManager.addImage(f.name, e.target.result, false, true);
                        LocalStorageManager.loadCurrentImage();
                        //foxyface.window.close();
                    }
                    else {
                        FileUploadManager.addFileData(f, e.target.result); // add multiple files to list
                        if (isLast) setTimeout(function() { LocalStorageManager.loadCurrentImage() },100);
                    }
                }
                catch (err) { // ADDED
                    // YOUR HANDLING HERE
                }
            };
        })(file, i == files.length - 1);
        reader.readAsDataURL(file);
    }
    return true;
};

Il tuo caso (eccellente) di prova effettua la chiamata sincrona, che è il motivo per cui l'errore viene catturato quando si prova. Questo è un modello più vicino a quello che succede:

try{
    (function(){
        setTimeout(function(){  // Use setTimeout to model asynchronicity
            throw 'foo'
        }, 100);
    })()
}
catch(e){
    console.debug(e)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top