抛出字符串而不是错误

时间:2012-07-16 09:57:41

标签: javascript

由于我们可以在Javascript中使用throw关键字抛出任何内容,我们不能直接抛出错误消息字符串吗?

有人知道这有什么问题吗?

让我为此添加一些背景:很多时候,在JavaScript世界中,人们依赖于参数检查而不是使用try-catch机制,因此仅使用throw抛出致命错误是有意义的。仍然,为了能够捕获一些系统错误,我必须为我自己的错误使用不同的类,而不是创建Error的子类,我想我应该只使用String。

5 个答案:

答案 0 :(得分:41)

抛出你喜欢的东西是可以的,但请记住,如果catch不在你自己的代码之外,它可能会期望一个完整的Error实例而不是一个普通的字符串。

答案 1 :(得分:31)

是的,您是can throw other values,但it's not a good practice

  

有人知道这有什么问题吗?

字符串不是错误对象,并且不传达任何有用的调试信息。 Devtools依赖于此,例如创建错误的文件和行,throw位置的堆栈跟踪等,它们可作为Error对象的属性。

每当您考虑抛出一个原始字符串值时,请改为抛出new Error("<the string>")

答案 2 :(得分:12)

你知道,你可以在邮件中抛出错误。

try {
    throw new Error("This is an error");
} catch (e) {
    alert(e.message); // This is an error
}

但你可以实际抛出字符串:

try {
    throw "This is an error";
} catch (e) {
    alert(e); // This is an error
}

答案 3 :(得分:2)

正如其他人在上面提到的那样,如果你没有抛出一个Error对象,那么你必须有try / catch块来捕获这些对象并适当地处理它们,否则就会因为调试而受到伤害。

但是,当涉及为控制程序流等非错误处理目的抛出错误时,这可能是一种有用的方法,可以在没有错误的情况下使用throw

当使用throws来控制程序流时,它在任何语言中效率都很低,因为运行时通常会做很多繁重的工作来解除调用堆栈信息并序列化数据,以便它可供用户使用。通过避免错误创建,您可以避免此性能损失。关键是你必须拥有一个知道如何处理这种情况的调用堆栈的处理程序。例如,如果您throw {isHardStop: true, stopCode: SOME_CODE}并设计处理程序来检测这一点,您可以展平一些代码或选择更清晰的语法。

此梯形图案例的处理程序可以结构如下:

try { ... } catch(thr) {
    if(!thr){
       // Is not Error or Json - Handle accordingly
    } else if(thr.isHardStop){
       // Handle the stop
    } else {
       // Most likely a real error. Handle accordingly
    }
}

答案 4 :(得分:0)

尽管您可以抛出所需的任何类型的数据,但这并不是调试时的最佳选择。 JS Error对象包含有关错误和消息的所有信息。而字符串只能包含一条消息。

此附加信息包括:

  1. 文件名:从哪个文件引发了错误
  2. 行号:从哪一行引发错误
  3. stacktrace :从哪个函数调用了错误

例如,这是来自chrome devtools的堆栈跟踪:

enter image description here