2017-03-17 60 views
3

我有一個節點中的子例程加載配置等,然後正確的應用程序啓動。事實證明,如果沒有找到文件,這個異常將無法捕捉並破壞應用程序。異常通過嘗試...滑入Javascript

相關代碼:

const fs = require('fs'); 

class FileParser { 
    static configure(filename) { 
     let file; 
     try { 
      file = this.loadFileSync(filename); 
     } catch (err) { 
      console.log(`File ${filename} not found`); 
     } 

     // ... 
    } 

    static loadFileSync(filename) { 
     fs.accessSync(filename, fs.F_OK); 
     return fs.readFileSync(filename, 'utf8'); 
    } 
} 

如果找不到文件fs.accessSync()會拋出異常。好,因爲它在那裏保護fs.readFileSync()。但我認爲這個例外會通過調用函數傳播,並且可以在那裏被捕獲 - 因此中的try...catch

我不想解決loadFileSync()中的異常,因爲它在其他地方使用,調用loadFileSync()的函數將以不同的方式處理異常。那麼,在這裏找不到文件的正確方法是什麼?冒泡例外情況一般?

+1

你可以試試: 把try/catch放在loadFileSync中,然後在catch裏面拋出同樣的錯誤。通過這種方式,您可以在accessSync上放置try/catch,然後引發錯誤將被配置捕獲。不知道它會工作 – binariedMe

+0

是的,嘗試...趕上fs.accessSync()的幫助。但我真的不知道它爲什麼會起作用,什麼是通用的方式。如果你能詳細說明,我將不勝感激。 – Forseti

+0

嗯,我無法對「accessSync」方法的實現進行太多評論,我相信實現會拋出一些未處理的錯誤,並且實際上並不是同步,而是一個循環,因此您無法獲取錯誤,但是封裝了相同的錯誤方法在try/catch中捕獲任何未處理的錯誤。 – binariedMe

回答

0

試試這個:

const fs = require('fs'); 
 

 
class FileParser { 
 
    static configure(filename) { 
 
     let file; 
 
     try { 
 
      file = this.loadFileSync(filename); 
 
     } catch (err) { 
 
      console.log(`File ${filename} not found`); 
 
     } 
 

 
     // ... 
 
    } 
 

 
    static loadFileSync(filename) { 
 
     try { 
 
     fs.accessSync(filename, fs.F_OK); 
 
     } catch(error) { 
 
      throw(error); 
 
     } 
 
     return fs.readFileSync(filename, 'utf8'); 
 
    } 
 
}

這可能會解決問題,爲什麼你都面臨這個問題,可能是因爲accessSync方法本身的實現的原因。

+0

是的,這解決了這個問題。不過,我不知道爲什麼。也許你對accessSync的實現是正確的。對不起延遲接受它,我希望有人會提供完整解釋問題的答案。 – Forseti

0

如果我正確理解你的問題,有兩種方法可以在這裏處理異常。

方法1:使用無極

class FileParser { 

     static configure(filename) { 
     let file; 
     loadFileSync(filename).then(function(result){ 
      // 'result' will contain whatever you have 
      // resolved in loadFileSync promise 
      file = result; 
     }).catch(function(err){ 
      // Handle err here 
     }); 
     } 

     static loadFileSync(filename) { 
     return new Promise(function(resolve, reject) { 
      fs.accessSync(filename, fs.F_OK); 
      // Check if everything is ok. 
      // If yes 
      return resolve(fs.readFileSync(filename, 'utf8')); 
      // Else 
      return reject(err); 
     }); 
     } 
    } 

方法二:利用回調

class FileParser { 
    static configure(filename) { 
    let file; 

    this.loadFileSync(filename, function(err, result) { 
     if (err) { 
     console.log(`File ${filename} not found`); 
     // return or throw 
     } 

     file = result; 
    }); 
    } 

    static loadFileSync(filename, cb) { 
    fs.accessSync(filename, fs.F_OK); 
    // Check if everything is ok. 
    // If yes 
    return cb(null, fs.readFileSync(filename, 'utf8')); 
    // Else 
    return cb(err); 
    } 
} 

希望你覺得它有用!