我想在我的JS代码中抛出一些东西,我希望它们是instanceof Error,但我也想让它们成为别的东西.
在Python中,通常会有一个子类Exception.
在JS中做什么是合适的?
我试图用ES6和Babel扩展Error.它没有成功.
class MyError extends Error {
constructor(m) {
super(m);
}
}
var error = new Error("ll");
var myerror = new MyError("ll");
console.log(error.message) //shows up correctly
console.log(myerror.message) //shows empty string
Run Code Online (Sandbox Code Playgroud)
Error对象永远不会获得正确的消息集.
现在我已经在SO上看到了一些解决方案(例如这里),但它们看起来都非常非ES6-y.如何以漂亮的ES6方式做到这一点?(那是在Babel工作)
在JavaScript中,这两个示例之间的区别是什么:
先决条件:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Run Code Online (Sandbox Code Playgroud)
继承示例A使用Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Run Code Online (Sandbox Code Playgroud)
继承示例B使用new关键字
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
Run Code Online (Sandbox Code Playgroud)
这两个例子似乎做同样的事情.你什么时候选择一个而不是另一个?
另一个问题:考虑下面链接中的代码(第15行),其中对函数自身构造函数的引用存储在原型中.为什么这有用?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
摘录(如果您不想打开链接):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
Run Code Online (Sandbox Code Playgroud) 我看了道格拉斯克罗克福德关于Javascript好的部分的演讲,我的眼睛被打开了.有一次,他说,"Javascript是唯一一种优秀的程序员相信他们可以有效地使用它而不需要学习它的语言." 然后我意识到,我就是那个人.
在那次演讲中,他做了一些声明,对我而言,非常令人惊讶和富有洞察力.例如,JavaScript是地球上最重要的编程语言.或者它是这个星球上最流行的语言.并且,它以许多严肃的方式被打破.
对我来说,他最令人惊讶的声明是"新危险".他不再使用它了.他也this没用.
他为Javascript中的构造函数提供了一个有趣的模式,一个允许私有和公共成员变量的模式,并且既不依赖new也不依赖this.它看起来像这样:
// neo-classical constructor
var container = function(initialParam) {
var instance = {}; // empty object
// private members
var privateField_Value = 0;
var privateField_Name = "default";
var privateMethod_M1 = function (a,b,c) {
// arbitrary
};
// initialParam is optional
if (typeof initialParam !== "undefined") {
privateField_Name= initialParam;
}
// public members
instance.publicMethod = function(a, b, c) {
// because of closures,
// can call private methods …Run Code Online (Sandbox Code Playgroud) 我在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构造函数中定义,但我不太明白为什么它还没有设置在第一位.
w3schools说异常可以是字符串,整数,布尔值或对象,但是给出的例子并没有让我觉得好,因为异常类型检查是通过字符串比较完成的.这是JavaScript中首选的异常处理方法吗?是否有内置的异常类型(如NullPointerException)?(如果是这样,他们是什么,他们使用什么样的继承,他们比其他选择更受欢迎?)
在我的NodeJS程序中,我解析了一些用户JSON文件.
所以我使用:
this.config = JSON.parse(fs.readFileSync(path));
Run Code Online (Sandbox Code Playgroud)
问题是如果json文件没有正确格式化,抛出的错误就像:
undefined:55
},
^
SyntaxError: Unexpected token }
at Object.parse (native)
at new MyApp (/path/to/docker/lib/node_modules/myApp/lib/my-app.js:30:28)
...
Run Code Online (Sandbox Code Playgroud)
由于它不是真正的用户友好,我想抛出一个Error指定一些用户友好的消息(如"你的配置文件没有很好的格式化"),但我想保持堆栈跟踪,以指向有问题的行.
在我使用的Java世界throw new Exception("My user friendly message", catchedException)中,为了得到导致那个的原始异常.
JS世界怎么可能?
console.log像这样输出,
{ [error: syntax error at or near "step"]
length: 86,
name: 'error',
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '62',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
file: 'scan.l',
line: '1001',
routine: 'scanner_yyerror' }
Run Code Online (Sandbox Code Playgroud)
但是JSON.stringify没有看到错误的叙述部分,
{ "长度":86, "名称": "错误", "严重性": "ERROR", "代码": "42601", "位置": "62", "文件": "scan.l里","行 ":" 1001" , "常规": "scanner_yyerror"}
我无法弄清楚如何得到这个"错误:列'未定义’不存在"读书wikies(https://github.com/brianc/node-postgres/wiki/Error-handling,HTTP://的NodeJS. ru/doc/v0.4.x/stdio.html#console.log)
代码是这样的,
client.query(selstring, function(err, result) {
if(err){
res.send(JSON.stringify(err));
console.log(err);
}else{
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:err.toString()显示error: syntax error at or near "step"
我的自定义Error类:
function MyError(message) {
this.message = message || "";
}
MyError.prototype = new Error();
MyError.prototype.name = "MyError";
MyError.prototype.toString = function() {
return "[" + this.name + "] " + this.message;
};
Run Code Online (Sandbox Code Playgroud)
如果我运行,throw new MyError("test")则FF/IE控制台显示默认消息而不是预期消息[MyError] test.
如何让JS引擎使用我的toString()方法?
javascript ×8
exception ×2
node.js ×2
babeljs ×1
class-design ×1
constructor ×1
ecmascript-6 ×1
inheritance ×1
oop ×1
stack-trace ×1
transpiler ×1