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

2020/09/28 23:21 · javascript ·  · 0评论

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

当我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]而我无法解析该对象。

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

而我什么时候做的

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

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

有什么不同?

代码中有区别吗?像字符串一样,只是作为字符串传递,而像对象一样传递,但是语法会有所不同吗?

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

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

这是有关The 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()).

抛出自己的错误(异常)

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

扔“我是邪恶的”

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
}

抛出错误(“我很邪恶”)

只是为了完整起见,这也是可行的,尽管从技术上来说并不是正确的方法-

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

下面的文章也许会更详细地说明哪个是更好的选择。throw 'An error'throw new Error('An error')

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

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

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

您首先提到此代码:

throw new Error('sample')

然后在第一个示例中,您将编写:

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

第一个Error对象实际上将起作用,因为它需要一个字符串值,在这种情况下为'sample'。第二个原因不是因为您试图传入一个对象,而是期望一个字符串。

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

TLDR:它们是等效的Error(x) === new Error(x)

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

来源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

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

throw 'Parameter is not a number!';
throw new Error('Parameter is not a number!');
throw Error('Parameter is not a number!');

上面的Console.log(e)将产生2个不同的结果:

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

Error构造函数用于创建一个错误对象。发生运行时错误时,将引发错误对象。Error对象也可以用作用户定义的异常的基础对象。

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

有错误对象和无错误对象时抛出错误的区别:


throw {'hehe':'haha'};

在chrome devtools中看起来像这样:

在此处输入图片说明

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


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

在chrome devtools中看起来像这样:

在此处输入图片说明

展开错误时,使用Error对象引发的错误为我们提供了堆栈跟踪。这为我们提供了有价值的信息,准确地指出了错误的来源,这在调试代码时通常是有价值的信息。还要注意,该错误为 [object Object],这是因为Error构造函数将消息字符串作为第一个参数。当它收到一个对象时,它将把它强制为一个字符串。

你可以throw作为对象

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

反应行为

除了其余答案,我想展示一下React的一个区别。

如果抛出,new Error()并且我处于开发模式,则将显示错误屏幕和控制台日志。如果我抛出字符串文字,那么如果我不注意控制台日志,我只会在控制台中看到它,并且可能会错过它。

在开发模式下,将错误引发日志登录到控制台显示错误屏幕(该屏幕在生产中将不可见)。

throw new Error("The application could not authenticate.");

错误画面反应

而以下代码仅登录到控制台:

throw "The application could not authenticate.";

throw something同时适用于对象和字符串,但不如其他方法受支持。throw new Error("") 将仅使用字符串并将对象转换为catch块中无用的[Object obj]。

本文地址:http://javascript.askforanswer.com/throw-new-errorhethrow-someobjectyoushenmequbie.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!