首页 文章

抛出字符串而不是错误

提问于
浏览
45

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

有谁知道这有什么捕获?

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

4 回答

  • 27

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

    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
    }
    
  • 2

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

  • 35

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

    有人知道这有什么捕获吗?

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

    无论何时想到抛出一个原始字符串值,都要抛出一个 new Error("<the string>") .

  • 11

    正如上面提到的那样,如果你没有抛出一个Error对象,那么你必须有try / catch块来捕获这些对象并适当地处理它们,否则就会陷入调试的伤害世界 .

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

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

    这个梯形图案例的处理程序可以构造如下:

    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
        }
    }
    

相关问题