Javascript “抛出新错误”和“抛出某个对象”之间有什么区别?

Javascript “抛出新错误”和“抛出某个对象”之间有什么区别?,javascript,object,error-handling,exception-handling,throw,Javascript,Object,Error Handling,Exception Handling,Throw,我想编写一个公共错误处理程序,它将捕获在代码的任何实例上故意抛出的自定义错误 当我抛出新的错误('sample')时,就像下面的代码一样 try { throw new Error({'hehe':'haha'}); // throw new Error('hehe'); } catch(e) { alert(e); console.log(e); } Firefox中的日志显示为错误:[object],我无法解析该对象 对于第二次抛出,日志显示为:Error:

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

当我抛出新的错误('sample')时,就像下面的代码一样

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}
Firefox中的日志显示为
错误:[object]
,我无法解析该对象

对于第二次抛出,日志显示为:
Error:hehe

而当我这么做的时候

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}
控制台显示为:
Object{hehe=“haha”}
,我可以在其中访问错误属性

有什么区别?

差异是否如代码中所示?Like字符串将作为字符串传递,object作为对象传递,但是语法会有所不同吗

我没有探索过抛出错误对象…我只抛出了字符串


除了上述两种方法,还有其他方法吗?

javascript中“抛出新错误”和“抛出某个对象”的区别在于,抛出新错误将传递给它的错误包装为以下格式−

{name:'Error',message:'String you passed in the constructor' }

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

这里有一个很好的解释

错误对象

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

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

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

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

错误名称描述
EvalError eval()函数中出现错误。
发生超出范围数值的范围错误。
ReferenceError发生非法引用。
SyntaxError eval()函数内的代码出现语法错误。
try/catch/finally不会捕获所有其他语法错误,并且会
触发与错误关联的默认浏览器错误消息。
要捕获实际语法错误,可以使用onerror事件。
TypeError预期变量类型中出现错误。
URIError编码或解码URI时出错
(即:调用encodeURI()时)。
抛出自己的错误(例外)


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

下面的文章可能会更详细地介绍哪一个是更好的选择<代码>抛出“错误”或
抛出新错误(“错误”)

这表明后者(
newerror()
)更可靠,因为Internet Explorer和Safari等浏览器(不确定版本)在使用前者时无法正确报告消息

这样做会导致抛出错误,但并非所有浏览器都会以您预期的方式响应。Firefox、Opera和Chrome都显示一条“未捕获异常”消息,然后包含消息字符串。Safari和Internet Explorer只是抛出一个“未捕获异常”错误,根本不提供消息字符串。显然,从调试的角度来看,这是次优的


您首先提到此代码:

throw new Error('sample')
然后在你的第一个例子中,你写道:

throw new Error({'hehe':'haha'}) 
第一个错误对象实际上很有用,因为它需要一个字符串值,在本例中为“sample”。第二个错误不会出现,因为您正试图传入一个对象,它需要一个字符串,并且不会显示有用的错误

错误对象将具有“message”属性,即“sample”。

抛出“我是邪恶的”
throw
终止进一步执行并在捕获错误时暴露消息字符串

试试看{
抛出“我是邪恶的”
log(“你永远都联系不到我”,123465)
}捕获(e){
console.log(e);//我是邪恶的

}
您可以
作为对象抛出

throw ({message: 'This Failed'})
然后,例如在您的
try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}
或者抛出一个字符串错误

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string

TLDR:它们是等效的
错误(x)==新错误(x)

资料来源:

抛出和抛出误差在功能上是等价的。但是,当您捕获它们并将它们序列化到console.log时,它们的序列化方式并不完全相同:

throw 'Parameter is not a number!';
throw new Error('Parameter is not a number!');
throw Error('Parameter is not a number!');
控制台。上述日志(e)将产生两种不同的结果:

Parameter is not a number!
Error: Parameter is not a number!
Error: Parameter is not a number!

Error
构造函数用于创建错误对象。发生运行时错误时抛出错误对象。错误对象也可以用作用户定义异常的基本对象

用户定义的错误通过
throw
语句抛出。程序控制将传递给调用堆栈中的第一个
catch

使用错误对象和不使用错误对象抛出错误的区别:


在chrome开发工具中,如下所示:

Chrome告诉我们有一个未捕获的错误,它只是一个JS对象。对象本身可能有关于错误的信息,但我们仍然不知道它来自何处。当我们处理代码并调试它时,它不是很有用


在chrome开发工具中,如下所示:

与错误obje一起引发的错误
Parameter is not a number!
Error: Parameter is not a number!
Error: Parameter is not a number!
throw {'hehe':'haha'};
throw new Error({'hehe':'haha'}); 
err = new Error('test')
err.stack