抛出错误和控制台输出错误有什么区别?

74
这两个语句有什么区别,是否有充分的理由使用其中一个而不是另一个?
throw Error("msg");
console.error("msg");

根据我的有限经验,我只看到过throw Error()的使用。这是否有特定的原因?

同样地,是否有一种类似于console.warn()的等效方式?


5
我认为 console.errorthrow 之间有很大的区别:console.error 只是用于打印错误信息并继续执行,但 throw 则会立即停止执行。 - Mritunjay
3个回答

91

throw ...会在当前代码块中引发异常并导致其退出,或者在try块中引发时流向下一个catch语句。

console.error只是将红色消息打印到浏览器开发工具的javascript控制台,不会导致执行流程的任何更改。


有没有办法捕获控制台错误日志?我正在包含一个外部脚本,我无法控制它们,不幸的是它们没有抛出异常,而是记录到console.error。 - Snowball

34

有些区别:

throw Error("msg"):

  1. 停止js执行。
  2. 主要用于代码处理。
  3. 可以改变主要执行流程。
  4. 此语法大多数浏览器都相同,因为它由 W3C 指定和验证。

console.error("msg"):

  1. 它只在浏览器控制台以红色显示输出。
  2. 它主要用于打印调试目的的值。
  3. 无法损害主要执行流程。
  4. 此语法有时根据供应商浏览器而有所不同,并且不受 W3C 标准化。

    即 对于 IE,接受的语法是 window.console.debug("msg")


我越来越发现IE喜欢成为浏览器中的独特存在。Window.console.debug()在非IE浏览器中能用吗? - user3886234
1
@Eclecticist - 大多数智能竞争对手也采用了这种方式,所以大多数情况下不用担心。 - Pramod S. Nikam

3

Throw 语句用于实际更改控制流程(跳出当前上下文并转到错误处理程序)以便通过编程方式处理错误。而 console 语句仅用于调试和将文本打印到错误控制台。您可能会看到它们结合使用,例如:

var doSomethingDangerous = function(response) {
   if (isMalformed(response)) {
     throw Error('Response is malformed.');
   }
   process(response);
};

var sendAsyncRequest = function() {
  var request = buildAsyncRequest();
  request.sendThen(function (response) {
     try {
       doSomethingDangerous(response);
     } catch (e) {
       console.error(e);
       doSomeAdditionalErrorHandling();
     }
  });
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接