我想在我的JS代码中抛出一些东西,我希望它们是instanceof Error,但我也想让它们成为别的东西.
在Python中,通常会有一个子类Exception.
在JS中做什么是合适的?
我可以在JavaScript中为用户定义的异常定义自定义类型吗?如果可以的话,我该怎么做?
出于某种原因,看起来构造函数委派在以下代码段中不起作用:
function NotImplementedError() {
Error.apply(this, arguments);
}
NotImplementedError.prototype = new Error();
var nie = new NotImplementedError("some message");
console.log("The message is: '"+nie.message+"'")
Run Code Online (Sandbox Code Playgroud)
运行这个给出The message is: ''
.有关为什么,或者是否有更好的方法来创建新Error
子类的任何想法?是否存在我不知道apply
的本机构Error
造函数的问题?
我很惊讶在阅读ES6时我找不到关于抽象类的任何内容.(通过"抽象类"我正在谈论它的Java含义,其中抽象类声明了子类必须实现的方法签名才能实现可实现化).
有没有人知道在ES6中实现抽象类的任何约定?能够通过静态分析捕获抽象类违规会很好.
如果我在运行时提出错误来表示尝试抽象类实例化,那么错误是什么?
我试图抛出一个自定义错误,我的"CustomError"类名称打印在控制台而不是"错误",但没有成功:
class CustomError extends Error {
constructor(message: string) {
super(`Lorem "${message}" ipsum dolor.`);
this.name = 'CustomError';
}
}
throw new CustomError('foo');
Run Code Online (Sandbox Code Playgroud)
输出是Uncaught Error: Lorem "foo" ipsum dolor
.
我的期望:Uncaught CustomError: Lorem "foo" ipsum dolor
.
我想知道是否只能使用TS来完成(没有搞乱JS原型)?
我在Javascript中定义自定义错误对象时发现了一个奇怪的行为:
function MyError(msg) {
Error.call(this, msg);
this.name = "MyError";
}
MyError.prototype.__proto__ = Error.prototype;
var error = new Error("message");
error.message; // "message"
var myError = new MyError("message");
myError instanceof Error; // true
myError.message; // "" !
Run Code Online (Sandbox Code Playgroud)
为什么new Error("message")
设置message
属性,而Error.call(this, msg);
不是?当然,我可以this.message = msg
在MyError
构造函数中定义,但我不太明白为什么它还没有设置在第一位.
这适用于摩卡/柴:
describe('Chai throw() with old-style custom errors', ()=> {
// old way
function ES5Error(message = 'todo', value) {
this.name = 'ES5Error';
this.message = message;
}
ES5Error.prototype = new Error();
it('catches ES5Errors', ()=> {
var err = new ES5Error('This is a bad function.');
var fn = function () { throw err; }
expect(fn).to.throw(ES5Error);
expect(fn).to.throw(Error);
expect(fn).to.throw(/bad function/);
expect(fn).to.not.throw('good function');
expect(fn).to.throw(ES5Error, /bad function/);
expect(fn).to.throw(err);
});
});
Run Code Online (Sandbox Code Playgroud)
虽然基于类的方法不:
describe('Chai throw() with new-style custom errors', ()=> {
// New way
class ExtendError extends Error { …
Run Code Online (Sandbox Code Playgroud) javascript ×7
exception ×3
ecmascript-6 ×2
babeljs ×1
chai ×1
mocha.js ×1
oop ×1
typescript ×1