2010-06-15 125 views
2

這可能有點難以遵循。JavaScript異常/錯誤處理不工作

我已經有了對象內的函數:

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

任何想法?

+3

這是一個很好的例子,它提出了一個關於複雜情況的簡潔問題。好一個。 – 2010-06-15 08:03:18

+0

啊,我應該看到的。謝謝你們的幫助。 – 2010-06-16 02:38:09

+0

án:如果以下答案之一幫助您解決了問題,請點擊答案頂部左邊的複選標記以接受其中一個答案。這標誌着「回答」的問題。 (http://stackoverflow.com/faq) – 2010-06-16 09:14:07

回答

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

可能是你的問題就在那裏 - 的的FileReader可能調用的onload異步,而此時你的try/catch不再在範圍內。 FileReader接口上可能存在單獨的錯誤處理函數,或者您可能需要將try/catch移動到您傳遞給onread()的匿名函數中。

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