Javascript “抛出新错误”和“抛出某个对象”之间有什么区别?
我想编写一个公共错误处理程序,它将捕获在代码的任何实例上故意抛出的自定义错误 当我抛出新的错误('sample')时,就像下面的代码一样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:
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相同 这里有一个很好的解释 错误对象 如果发生错误,我们能从中提取什么?所有浏览器中的错误对象都支持以下两个属性:
- 名称:错误的名称,或者更具体地说,错误所属的构造函数的名称
- 消息:错误的描述,此描述因浏览器而异
错误名称描述
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