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
var reader = new FileReader();
                reader.onload = (function(f, isLast) {

おそらくそれがあなたの問題です-FileReaderは、try / catchがスコープ内になくなったときに、おそらく非同期でonloadを呼び出します。FileReaderインターフェースで使用可能な別のエラーハンドラー関数がある場合もあれば、onread()に渡す匿名関数にtry/catchを移動する必要がある場合もあります。

于 2010-06-15T08:05:24.030 に答える
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 に答える