JavaScript异常/错误处理不起作用

时间:2010-06-15 07:52:14

标签: javascript exception event-bubbling throw

这可能有点难以理解。

我在对象中有一个函数:

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:2)

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

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