这可能有点难以理解。
我在对象中有一个函数:
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)
}
有什么想法吗?
答案 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()的匿名函数。