Javascript-您可以在错误中抛出对象吗?

时间:2018-06-20 18:07:10

标签: javascript error-handling

是否可以使用Error抛出对象?在下面的示例中,控制台显示undefined

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

4 个答案:

答案 0 :(得分:17)

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

try {
  // ...
  throw {
    foo: "bar",
    error: new Error()
  };

throw语句不是挑剔的,但是Error()构造函数是。当然,如果您抛出的不是错误,则只有在捕获环境期望它是您抛出的任何东西时才有用。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

使用private void ListRappor_SelectedIndexChanged(object sender, EventArgs e) { var ListR = sender as Picker; var choix=ListR.Items[ListR.SelectedIndex]; switch(choix){ } } JSON.stringify()可能会很痛苦,甚至没有必要。我建议为JSON.parse()对象创建自己的属性,而不是将对象传递给Error参数,该参数只接受一个字符串。

message

答案 3 :(得分:0)

对于使用的任何人,您都应该扩展ErrorConstructor接口并添加自己的可以接受对象的构造函数

class MyError extends Error {
  readonly id: number

  // base constructor only accepts string message as an argument
  // we extend it here to accept object, allowing us to pass other data
  constructor({ id, name, message }) {
    super(message)
    this.name = name // this property's already existed 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 {
    // ...
  }
}