“抛出新错误”和“抛出一些对象”有什么区别?

我想编写一个通用的错误处理程序,它将捕获在任何代码实例中故意抛出的自定义错误。

当我在下面的代码中做喜欢throw new Error('sample')

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

日志在Firefox中显示为,我无法解析该对象。Error: [object Object]

对于第二个,日志显示为:throwError: hehe

而当我这样做的时候

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

控制台显示为:,我能够在其中访问错误属性。Object { hehe="haha"}

有什么区别?

差异是否如代码中看到的一样?就像字符串将仅作为字符串传递,对象作为对象传递,但语法会有所不同?

我还没有探索抛出错误对象...我只做了扔绳子。

除了上面提到的两种方法之外,还有其他方法吗?


答案 1

javascript中的“throw new Error”和“throw someObject”之间的区别在于,throw new Error以以下格式包装传递给它的错误 -

{ 名称:“错误”,消息:“在构造函数中传递的字符串” }

throw someObject 将按原样抛出对象,并且不允许从 try 块执行任何进一步的代码,即与 throw new Error 相同。

这里有一个关于错误对象和抛出你自己的错误的很好的解释

错误对象

在发生错误时,我们可以从中提取什么?所有浏览器中的 Error 对象都支持以下两个属性:

  • name:错误的名称,或者更具体地说,错误所属的构造函数的名称。

  • 消息:错误的描述,此描述因浏览器而异。

name 属性可以返回六个可能的值,如前所述,这些值对应于错误构造函数的名称。它们是:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

抛出自己的错误(异常)

在将控制权从 try 块自动转移到 catch 块之前,您不必等待 6 种错误类型之一发生,还可以显式抛出自己的异常以强制按需发生。这对于创建您自己的错误定义以及何时应转移控制权以进行捕获非常有用。


答案 2

扔“我是邪恶的”

throw终止进一步的执行并在捕获错误时公开消息字符串。

try {
  throw "I'm Evil"
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e); // I'm Evil
}

抛出后的控制台将永远不会到达终止原因。


抛出新的错误(“我是邪恶的”)

throw new Error公开一个错误事件,其中包含两个参数名称消息。它还会终止进一步的执行

try {
  throw new Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); // Error I'm Evil
}

throw Error(“I'm Evil”)

只是为了完整性,这也有效,尽管从技术上讲这不是正确的方法 -

try {
  throw Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); // Error I'm Evil
}

console.log(typeof(new Error("hello"))) // object
console.log(typeof(Error)) // function