`throw new Error`和`throw someObject`有什么区别?

我想编写一个通用的error handling程序,它会捕获代码中任何实例抛出的自定义错误。

当我没有像下面的代码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] ,我无法parsing对象。

对于第二次throw日志显示为: Error: hehe

而当我做到了

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

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

有什么不同?

代码中看到的差异是什么? 像string将只是作为string和对象作为对象传递,但语法会不同?

我还没有探讨抛出错误对象…我只做了扔string。

除了上面提到的两种方法还有别的方法吗?

这里是关于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种types的错误之一发生,你也可以明确地抛出你自己的exception,迫使它按需发生。 这对于创build自己的错误定义以及何时应该将控制转移到捕捉中是很好的。

下面的文章或许会更详细地介绍哪一个是更好的select; throw 'An error'throw new Error('An error')

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

它build议后者( new Error() )更可靠,因为像Internet Explorer和Safari(不确定版本)的浏览器在使用前者时不会正确地报告消息。

这样做会导致错误被抛出,但并不是所有的浏览器都以你期望的方式来响应。 Firefox,Opera和Chrome都显示“未捕获的exception”消息,然后包含消息string。 Safari和Internet Explorer只是抛出一个“未捕获的exception”错误,根本不提供消息string。 显然,从debugging的angular度来看,这是不理想的。

你首先提到这个代码:

 throw new Error('sample') 

然后在第一个例子中写下:

 throw new Error({'hehe':'haha'}) 

第一个Error对象实际上可以工作,因为它需要一个string值,在这个例子中是“sample”。 第二个不会因为你正在尝试传入一个对象而期望一个string。

错误对象将具有“消息”属性,这将是“示例”。

扔“我是邪恶”

抛出将会终止进一步的执行和暴露的消息string捕捉错误。

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

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

抛出新的错误(“我好甜”)

抛出新的错误暴露错误事件与两个参数名称消息 。 它也终止进一步的执行

 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 }