2

这可能有点难以理解。

我在对象中有一个函数:

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

在它调用的 try 块内:

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 调用:

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

如果使用了过多的本地存储,localStorage.setItem 会引发错误。我想在 f_openFRHandler (第一个代码示例)中捕获该错误,但它被发送到错误控制台而不是 catch 块。我在我的 Firebug 控制台中尝试了以下代码,以确保我没有发疯,并且尽管有许多级别的函数嵌套,但它仍按预期工作:

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

有任何想法吗?

4

2 回答 2

2

我认为问题在于,在您的f_openFRHandler功能完成后,错误会在稍后发生。请注意,LocalStorageManager.addImage正在调用的函数被设置为onload阅读器上的处理程序,而不是立即调用。稍后在加载数据时异步调用它。

您需要将您try..catch的匿名函数放入正在创建并分配给该事件的匿名函数中,例如:

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

您的(优秀的)测试用例同步进行调用,这就是为什么在您尝试时会捕获错误。这是一个更接近实际情况的模型:

try{
    (function(){
        setTimeout(function(){  // Use setTimeout to model asynchronicity
            throw 'foo'
        }, 100);
    })()
}
catch(e){
    console.debug(e)
}
于 2010-06-15T07:57:40.143 回答
2
var reader = new FileReader();
                reader.onload = (function(f, isLast) {

可能这就是您的问题所在 - FileReader 可能在您的 try/catch 不再在范围内时异步调用 onload。FileReader 接口上可能有一个单独的错误处理函数,或者您可能需要将 try/catch 移动到您传递给 onread() 的匿名函数中。

于 2010-06-15T08:05:24.030 回答