JavaScript/NodeJs 异常处理
JavaScript/NodeJs Exception Handling
我对如何正确捕获 Java脚本异常感到困惑。我有 Java Dev 的背景,所以我对错误处理的了解很多都来自于它。
我用的是sequelize来做持久化,所以瞎折腾,网上找了个例子:
try {
//do sequelize stuff
} catch (error){
switch (error.name) {
case 'SequelizeUniqueConstraintError':
//do something
break;
case 'SequelizeValidationError':
//do something else
break;
default:
//do panic stuff
}
}
嗯...这鼓励我看一看 sequelizer 的源代码...
抛出的,基本上是:
class UniqueConstraintError extends ValidationError {
constructor(options) {
options = options || {};
options.parent = options.parent || { sql: '' };
options.message = options.message || options.parent.message || 'Validation Error';
options.errors = options.errors || {};
super(options.message, options.errors);
this.name = 'SequelizeUniqueConstraintError';
this.errors = options.errors;
this.fields = options.fields;
this.parent = options.parent;
this.original = options.parent;
this.sql = options.parent.sql;
}
}
嗯……有趣……为什么异常除了已经有一个类型之外还要有一个名字?
所以我改变了我的代码来处理类型本身而不是名称,结果是这样的:
try {
//do sequelize stuff
} catch (error){
if (error instanceof UniqueConstraintError) {
//do something
} else if (error instanceof ValidationError) {
//do something else
} else {
//do panic stuff
}
}
不用说,两者都很好。
我在这里遗漏了什么吗?我是不是听错教程了?
解决方案是 'par excellence' 以处理现代 JavaScript 中抛出的多个可能异常? ( 可能不一定是我在这里介绍的两个中的任何一个)
谢谢。
Why would an exception have a name, besides already having a type?
出于与使用错误代码相同的原因:它们可以很好地序列化并且不需要对 class 的引用。同样在极少数情况下(应该避免),您最终可能会加载库的多个副本,这些副本定义了多个具有相同名称的不同 classes。检查 .name
字符串仍然有效,使用 instanceof
仅当您引用相同的 class.
时才有效
Which solution would be the 'par excellence' in order to deal with multiple possible exceptions being thrown in modern JavaScript?
如果 instanceof
适合您,那么使用它没有任何问题 - 它非常地道。只是一些程序员更喜欢一种更具防御性的风格,这种风格在面对错误时更具弹性。使用字符串常量有其自身的一系列问题,例如容易出现拼写错误和 API 不兼容。
检查 name
属性 的值可能被认为更安全 and/or 更简单,因为:
例如,UniqueConstraintError
的一个实例也是ValidationError
的一个实例,因为前者扩展了后者,所以instanceof
检查的顺序是很关键,而且容易出错。
例如,instanceof UniqueConstraintError
可能 return false
如果实例源自具有自己的全局范围的不同执行上下文,例如 iframe
.
如果您认为这些原因都不相关,那么 instanceof
在我看来更符合惯用语,也是更好的选择。
我对如何正确捕获 Java脚本异常感到困惑。我有 Java Dev 的背景,所以我对错误处理的了解很多都来自于它。
我用的是sequelize来做持久化,所以瞎折腾,网上找了个例子:
try {
//do sequelize stuff
} catch (error){
switch (error.name) {
case 'SequelizeUniqueConstraintError':
//do something
break;
case 'SequelizeValidationError':
//do something else
break;
default:
//do panic stuff
}
}
嗯...这鼓励我看一看 sequelizer 的源代码...
抛出的,基本上是:
class UniqueConstraintError extends ValidationError {
constructor(options) {
options = options || {};
options.parent = options.parent || { sql: '' };
options.message = options.message || options.parent.message || 'Validation Error';
options.errors = options.errors || {};
super(options.message, options.errors);
this.name = 'SequelizeUniqueConstraintError';
this.errors = options.errors;
this.fields = options.fields;
this.parent = options.parent;
this.original = options.parent;
this.sql = options.parent.sql;
}
}
嗯……有趣……为什么异常除了已经有一个类型之外还要有一个名字? 所以我改变了我的代码来处理类型本身而不是名称,结果是这样的:
try {
//do sequelize stuff
} catch (error){
if (error instanceof UniqueConstraintError) {
//do something
} else if (error instanceof ValidationError) {
//do something else
} else {
//do panic stuff
}
}
不用说,两者都很好。
我在这里遗漏了什么吗?我是不是听错教程了?
解决方案是 'par excellence' 以处理现代 JavaScript 中抛出的多个可能异常? ( 可能不一定是我在这里介绍的两个中的任何一个)
谢谢。
Why would an exception have a name, besides already having a type?
出于与使用错误代码相同的原因:它们可以很好地序列化并且不需要对 class 的引用。同样在极少数情况下(应该避免),您最终可能会加载库的多个副本,这些副本定义了多个具有相同名称的不同 classes。检查 .name
字符串仍然有效,使用 instanceof
仅当您引用相同的 class.
Which solution would be the 'par excellence' in order to deal with multiple possible exceptions being thrown in modern JavaScript?
如果 instanceof
适合您,那么使用它没有任何问题 - 它非常地道。只是一些程序员更喜欢一种更具防御性的风格,这种风格在面对错误时更具弹性。使用字符串常量有其自身的一系列问题,例如容易出现拼写错误和 API 不兼容。
检查 name
属性 的值可能被认为更安全 and/or 更简单,因为:
例如,
UniqueConstraintError
的一个实例也是ValidationError
的一个实例,因为前者扩展了后者,所以instanceof
检查的顺序是很关键,而且容易出错。例如,
instanceof UniqueConstraintError
可能 returnfalse
如果实例源自具有自己的全局范围的不同执行上下文,例如iframe
.
如果您认为这些原因都不相关,那么 instanceof
在我看来更符合惯用语,也是更好的选择。