Javascript-你能在错误中抛出一个对象吗?

Javascript-你能在错误中抛出一个对象吗?,javascript,error-handling,typescript,Javascript,Error Handling,Typescript,是否可以使用错误抛出对象?在下面的示例中,控制台显示未定义 try { throw Error({foo: 'bar'}); } catch (err) { console.log(err.message.foo); } 您可以抛出自己的对象,并将错误实例与其关联: try { // ... throw { foo: "bar", error: new Error() }; throw语句不挑剔,但是Error()构造函数挑剔。当然,如果您抛出的不

是否可以使用
错误
抛出对象?在下面的示例中,控制台显示
未定义

try {
    throw Error({foo: 'bar'});
} catch (err) {
    console.log(err.message.foo);
}

您可以抛出自己的对象,并将错误实例与其关联:

try {
  // ...
  throw {
    foo: "bar",
    error: new Error()
  };
throw
语句不挑剔,但是
Error()
构造函数挑剔。当然,如果您抛出的不是错误的东西,那么只有当捕获环境希望它是您抛出的任何东西时,它才有用


让Error对象具有自定义抛出值的一部分是有用的,因为构造的错误实例具有(在支持浏览器中,目前看起来基本上是所有浏览器中)关联的堆栈跟踪。

您可以尝试将对象转换为JSON字符串,然后在catch语句中将错误消息解析为JSON对象:

try {
    throw Error(JSON.stringify({foo: 'bar'}));
} catch (err) {
    console.log(JSON.parse(err.message).foo);
}
使用
JSON.stringify()。我建议为
Error
对象创建自己的属性,而不是将对象传递给
message
参数,该参数只接受字符串

try {
  let error = new Error();

  error = { ...error, foo: 'bar' };

  throw error;
} catch (err) {
  console.log(err.foo);
}
对于使用的任何人,您应该扩展
ErrorConstructor
接口,并添加您自己的构造函数来代替接受对象

类MyError扩展错误{
只读id:number
//基本构造函数仅接受字符串消息作为参数
//我们在这里扩展它以接受对象,允许我们传递其他数据
构造函数({id,name,message}){
超级(讯息)
this.name=name//此属性在父级中已存在
this.id=id
}
}
用法
函数doSomething(){
如果(有什么不对劲){
抛出新的MyError({
身份证号码:502,
名称:“油门违反”,
消息:“违反退避参数”,
});
}
}
试一试{
doSomething()
}捕捉(错误){
如果(MyError的错误实例){
日志(“错误id:+err.id”);
日志(“错误名称:”+err.name);
日志(“错误消息:+err.message”);
警报(err.property);//名称
}否则{
// ...
}
}

你可以抛出任何东西,但这不是调用错误构造函数的方式…@dandavis
抛出新错误()
抛出错误()
@K48:我指的是将不可字符串化的对象传递给构造函数…
JSON.stringify()
将返回
[]
在这种情况下。这对于所有情况都是一个很好的选择,除非您希望使用
instanceOf
根据错误类型更改捕获行为thrown@SandyGifford在这种情况下,只需使用
Object.assign
而不是扩展运算符,即
Object.assign(错误,{foo:'bar})