2017-03-17 2 views
3

Ich habe eine Unterroutine in Node, um die Konfiguration usw. zu laden, bevor die richtige Anwendung startet. Es stellt sich heraus, dass für den Fall, dass die Datei nicht gefunden wird, die Ausnahme nicht erfasst wird und die App bricht.Exception rutscht durch try ... catch in Javascript

Relevante Code:

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

Wenn die Datei nicht gefunden wird, die fs.accessSync() wird eine Ausnahme werfen. Gut, denn es ist da, um fs.readFileSync() zu sichern. Aber ich dachte, dass diese Ausnahme sich durch aufrufende Funktionen ausbreiten wird und dort eingefangen werden kann - daher die try...catch in configure().

Ich möchte nicht die Ausnahme in loadFileSync() lösen, wie es an anderer Stelle verwendet wird und Funktionen aufrufen loadFileSync() sind mit der Ausnahme anders zu behandeln. Also, was ist der richtige Weg, um gegen Dateien, die hier nicht gefunden werden, und sprudelnde Ausnahmen im Allgemeinen zu schützen?

+1

können Sie versuchen: setzen Sie versuchen/fangen in loadFileSync und dann innerhalb fangen fangen den gleichen Fehler. Auf diese Weise setzen Sie try/catch auf accessSync und der Fehler wird von configure abgefangen. Nicht sicher, es wird funktionieren – binariedMe

+0

Ja, versuchen Sie ... fangen Sie fs.accessSync() hilft. Aber ich weiß nicht wirklich, warum es funktioniert und wie es allgemein funktioniert. Ich werde dankbar sein, wenn Sie es ausarbeiten könnten. – Forseti

+0

Nun, ich kann nicht zu viel über die Implementierung von "AccessSync" -Methode kommentieren und ich glaube, dass die Implementierung einige unbehandelte Fehler wirft und nicht wirklich synchron ist, sondern eine Schleife und daher sind Sie nicht in der Lage, den Fehler zu bekommen, aber die gleiche Kapselung Methode in try/catch forces, um einen nicht behandelten Fehler zu erfassen. – binariedMe

Antwort

0

Versuchen Sie folgendes:

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

Dies das Problem lösen kann und den Grund, warum Sie dieses Problem konfrontiert sind, weil der Durchführung der Methode AccessSync selbst sein kann.

+0

Ja, das löst das Problem. Trotzdem, ich weiß nicht warum. Vielleicht haben Sie recht mit der accessSync-Implementierung. Sorry für die Verzögerung bei der Annahme, ich hoffte, dass jemand die Antwort liefern würde, die das Problem vollständig erklärt. – Forseti

0

Wenn ich Ihre Frage richtig verstanden habe, gibt es zwei Möglichkeiten, die Sie hier behandeln können.

Methode 1: Verwenden Versprechen

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

Methode 2: Verwenden Rückrufe

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

Hoffe, Sie finden es nützlich!