web-dev-qa-db-fra.com

Gestion des erreurs spécifiques dans JavaScript (pensez aux exceptions)

Comment implémenteriez-vous différents types d'erreurs, de sorte que vous seriez en mesure d'en détecter des spécifiques et de laisser les autres bouillonner ...?

Une façon d'y parvenir est de modifier le prototype de l'objet Error:

Error.prototype.sender = "";


function throwSpecificError()
{
    var e = new Error();

    e.sender = "specific";

    throw e;
}

Attraper une erreur spécifique:

try
{
    throwSpecificError();
}

catch (e)
{
    if (e.sender !== "specific") throw e;

    // handle specific error
}


Avez-vous des alternatives?

95
cllpse

Pour créer des exceptions personnalisées, vous pouvez hériter de l'objet Error:

function SpecificError () {

}

SpecificError.prototype = new Error();

// ...
try {
  throw new SpecificError;
} catch (e) {
  if (e instanceof SpecificError) {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}

Une approche minimaliste, sans hériter d'Erreur, pourrait être de lancer un objet simple ayant un nom et des propriétés de message:

function throwSpecificError() {
  throw {
    name: 'SpecificError',
    message: 'SpecificError occurred!'
  };
}


// ...
try {
  throwSpecificError();
} catch (e) {
  if (e.name == 'SpecificError') {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}
128
CMS

Comme indiqué dans les commentaires ci-dessous, cela est spécifique à Mozilla, mais vous pouvez utiliser des blocs de "capture conditionnelle". par exemple.:

try {
  ...
  throwSpecificError();
  ...
}
catch (e if e.sender === "specific") {
  specificHandler(e);
}
catch (e if e.sender === "unspecific") {
  unspecificHandler(e);
}
catch (e) {
  // don't know what to do
  throw e;
} 

Cela donne quelque chose de plus semblable à la gestion des exceptions typées utilisée en Java, au moins syntaxiquement.

14
Andy

try-catch-finally.js

Exemple

_try(function () {
    throw 'My error';
})
.catch(Error, function (e) {
    console.log('Caught Error: ' + e);
})
.catch(String, function (e) {
    console.log('Caught String: ' + e);
})
.catch(function (e) {
    console.log('Caught other: ' + e);
})
.finally(function () {
    console.log('Error was caught explicitly');
});
9
c24w