web-dev-qa-db-de.com

Umgang mit bestimmten Fehlern in JavaScript (Ausnahmen beachten)

Wie würden Sie verschiedene Arten von Fehlern implementieren, damit Sie bestimmte Fehler abfangen und andere in die Luft sprudeln lassen können?

Eine Möglichkeit, dies zu erreichen, besteht darin, den Prototyp des Objekts Error zu ändern:

Error.prototype.sender = "";


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

    e.sender = "specific";

    throw e;
}

Bestimmten Fehler abfangen:

try
{
    throwSpecificError();
}

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

    // handle specific error
}


Habt ihr Alternativen?

95
cllpse

Um benutzerdefinierte Ausnahmen zu erstellen, können Sie vom Error-Objekt Folgendes erben:

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

Ein minimalistischer Ansatz, ohne von Error zu erben, könnte darin bestehen, ein einfaches Objekt mit einem Namen und Nachrichteneigenschaften auszulösen:

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

Wie in den Kommentaren unten erwähnt, ist dies Mozilla-spezifisch, Sie können jedoch auch bedingte catch-Blöcke verwenden. z.B.:

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

Zumindest syntaktisch entspricht dies eher der typisierten Ausnahmebehandlung in Java.

14
Andy

try-catch-finally.js

Beispiel

_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