使用Error
语句来扔出一个物体是否可能?在下面的例子中,控制台会显示undefined
。
try {
throw Error({foo: 'bar'});
} catch (err) {
console.log(err.message.foo);
}
使用Error
语句来扔出一个物体是否可能?在下面的例子中,控制台会显示undefined
。
try {
throw Error({foo: 'bar'});
} catch (err) {
console.log(err.message.foo);
}
try {
// ...
throw {
foo: "bar",
error: new Error()
};
throw
语句并不挑剔,但Error()
构造函数是。当然,如果你抛出的不是一个Error,只有在捕获环境期望它是你所抛出的任何东西时才有用。
将Error对象作为自定义抛出值的一部分是有用的,因为一个构建的Error实例(在支持的浏览器中,目前似乎几乎都是)有一个关联的堆栈跟踪。
如果您正在使用typescript,您可以扩展ErrorConstructor
接口并添加自己的构造函数,该构造函数接受像这样的对象:
class MyError extends Error {
readonly id: number
// base constructor only accepts string message as an argument
// we extend it here to accept an object, allowing us to pass other data
constructor({ id, name, message }) {
super(message)
this.name = name // this property is defined in parent
this.id = id
}
}
function doSomething() {
if (somethingWentWrong) {
throw new MyError({
id: 502,
name: "throttle_violation",
message: "Violation of backoff parameter",
});
}
}
try {
doSomething()
} catch (err) {
if (err instanceof MyError) {
console.log("error id: " + err.id);
console.log("error name: " + err.name);
console.log("error message: " + err.message);
alert(err.property); // name
} else {
// ...
}
}
try {
throw Error(JSON.stringify({foo: 'bar'}));
} catch (err) {
console.log(JSON.parse(err.message).foo);
}
JSON.stringify()
将返回[]
。 - Wei Xia你可以尝试使用“cause”属性:
目前TS对其的值类型存在不准确的问题,正在官方论坛上讨论解决方法。
try {
throw new Error('Failed in some way', {
cause: {foo: 'bar'}
});
} catch(e) {
console.log(e); // Error('Failed in some way')
console.log(e.cause) // {foo: 'bar'}
}
或者抛出带有自定义属性的错误实例
try {
const error = new Error('Failed in some way');
error.foo = 'bar';
throw error;
} catch(e) {
console.log(e); // Error('Failed in some way')
console.log(e.foo) // 'bar'
}
JSON.stringify()
和 JSON.parse()
可能很麻烦,而且并不是必需的。建议创建您自己的属性来处理 Error
对象,而非将对象传递给 message
参数(该参数只接受字符串)。try {
let error = new Error();
Object.assign(error, { foo: 'bar' });
throw error;
} catch (err) {
console.log(err.foo);
}
instanceOf
根据抛出的错误类型改变 catch 行为的情况。 - Sandy GiffordObject.assign
而不是展开运算符,即Object.assign(error, { foo: 'bar' })
。 - Chris Haines
throw new Error()
和throw Error()
之间没有区别。 - user6269864