Mettez à jour votre code pour assigner votre prototype à Error.prototype et l'instanceof et vos assertions fonctionnent.
function NotImplementedError(message = "") {
this.name = "NotImplementedError";
this.message = message;
}
NotImplementedError.prototype = Error.prototype;
Cependant, je me contenterais de lancer votre propre objet et de vérifier la propriété du nom.
throw {name : "NotImplementedError", message : "too lazy to implement"};
Modifier en fonction des commentaires
Après avoir regardé les commentaires et essayé de me rappeler pourquoi j'aurais attribué le prototype à Error.prototype
au lieu de new Error()
comme Nicholas Zakas l'a fait dans son article J'ai créé un jsFiddle avec le code ci-dessous :
function NotImplementedError(message = "") {
this.name = "NotImplementedError";
this.message = message;
}
NotImplementedError.prototype = Error.prototype;
function NotImplementedError2(message = "") {
this.message = message;
}
NotImplementedError2.prototype = new Error();
try {
var e = new NotImplementedError("NotImplementedError message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError = " + (ex1 instanceof NotImplementedError));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}
try {
var e = new NotImplementedError2("NotImplementedError2 message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError2 = " + (ex1 instanceof NotImplementedError2));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}
La sortie de la console était la suivante.
undefined
ex1 instanceof NotImplementedError = true
ex1 instanceof Error = true
ex1.name = NotImplementedError
ex1.message = NotImplementedError message
Error
at window.onload (http://fiddle.jshell.net/MwMEJ/show/:29:34)
ex1 instanceof NotImplementedError2 = true
ex1 instanceof Error = true
ex1.name = Error
ex1.message = NotImplementedError2 message
Cela confirme que le "problème" que j'ai rencontré était la propriété de la pile de l'erreur était le numéro de ligne où new Error()
a été créé, et non l'endroit où le throw e
survenu. Cependant, c'est peut-être mieux que d'avoir l'effet secondaire d'un NotImplementedError.prototype.name = "NotImplementedError"
ligne affectant l'objet Erreur.
De même, remarquez avec NotImplementedError2
lorsque je n'ai pas défini l'option .name
explicitement, il est égal à "Error". Cependant, comme mentionné dans les commentaires, parce que cette version définit le prototype à new Error()
je pourrais mettre NotImplementedError2.prototype.name = "NotImplementedError2"
et être OK.
0 votes
L'assertion nie instanceof NotImplementedError fonctionne-t-elle après vos modifications ? Je pensais que pour que cela fonctionne, vous deviez définir NotImplementedError.prototype.constructor explicitement.
0 votes
La prochaine fois, veuillez supprimer tout le code superflu qui n'est pas nécessaire à la démonstration de votre problème. En outre, wtc est js.jar ? Est-ce nécessaire pour reproduire le problème ?
2 votes
J'ai modifié cette question pour qu'elle soit compréhensible en 10 secondes plutôt qu'en 10 minutes.
0 votes
J'ai créé une bibliothèque d'héritage/classe qui hérite des types d'erreur correctement : github.com/fresheneesz/proto
0 votes
exceptionsjs.com fournit une NotImplementedException et d'autres types d'exception couramment utilisés mais non fournis. Il offre également la possibilité de créer des types d'exception personnalisés.
1 votes
jsfiddle pour quelques-unes des meilleures réponses.
0 votes
Beaucoup d'entre eux bénéficieraient probablement de voir stackoverflow.com/questions/1382107/