【问题标题】:How to throw an error without throw如何在没有 throw 的情况下抛出错误
【发布时间】:2018-11-07 09:05:42
【问题描述】:

最近有人问我一个问题

有没有办法在 javaScript 中不使用throw 来引发错误?

据我所知,只有一种方法可以在 JavaScript 中引发错误,那就是在 JavaScript 中使用 throw 语句,如下所示:

var myFunc = () => {
  // some code here 
  throw 'Some error' // in a conditional 
  // some more code
}

try {
  myFunc()
}catch(e) {
  console.log(e)
}

我不知道我说No, there is no other way 的任何其他方式。但现在我想知道我是否正确?

所以问题是你是否可以在 JavaScript 中抛出 custom 错误而不使用throw


限制:

  • 请不要使用evalFunction
  • 不要在代码中使用throw

补充:

如果不使用Error这个词就可以抛出错误

【问题讨论】:

  • 是否构造字符串“throw”并使用例如eval 计数?
  • @ASDFGerte : 谢绝评价
  • 问题是否包括除以零之类的能力?
  • @slash_rick_dot : 没有被零除(这个问题完全禁止我除法)
  • 代码战,amirite? :D

标签: javascript error-handling try-catch


【解决方案1】:
const myTypeErr = () => `This is a Custom Err Message... \nand it`()

try {
  myTypeErr()
} catch(e) {} // caught

myTypeErr() // Uncaught TypeError: "This is a Custom Err Message... 
              // and it" is not a function

【讨论】:

    【解决方案2】:

    我认为,如果你想使用try...catch 块,你需要扔一些东西才能到达catchpart。您可以使用几乎所有因错误而失败的东西来执行此操作(如其他帖子中所述)。

    如果在某个时候,你想运行或死亡,而不必自己编写 throw 语句,你总是可以做一个断言:

    const myFunction = () => {
      try {
        assert.fail();
        console.log(`Did not work :)`);
      } catch (e) {
        console.log(`OK`);
      }
    };
    

    当然,我宁愿尝试断言一些积极的东西(更多禅宗),我需要这些东西才能继续。

    【讨论】:

      【解决方案3】:

      function throwErrorWithoutThrow(msg) {
        // get sample error 
        try {
          NaN();
        } catch (typeError) {
          // aquire reference to Error
          let E = typeError.__proto__.__proto__.constructor;
      
          // prepare custom Error
          let error = E(msg);
      
          // throw custom Error
          return Promise.reject(error);
        }
      }
      
      throwErrorWithoutThrow("hi")
        /* catch the error, you have to use .catch as this is a promise
        that's the only drawback, you can't use try-catch to catch these errors */
        .catch((e) => {
          console.log("Caught You!");
          console.error(e);
        });

      【讨论】:

      • 您可以将其包装在函数 myCustomErr(message) 和范围 E 中,恕我直言,从另一个错误中获取构造函数的最佳答案。
      • 好主意,看看更新(虽然只是将它包装在一个函数中),我还添加了关于如何捕获这些错误的评论。
      • 这是 Promise 的缺点,由于没有人认为 try{}catch{} 友好的解决方案,我发布了自己的。
      【解决方案4】:

      如果您只想抛出错误,那么只需执行无效操作即可。我在下面列出了一些。在浏览器控制台上运行它们以查看错误(在 chrome 和 firefox 上测试)。

      var myFunc = () => {
        encodeURI('\uD800');    // URIError
        a = l;                  // ReferenceError
        null.f()                // TypeError
      }
      
      
      try {
        myFunc()
      }catch(e) {
        console.log(e);
      }

      【讨论】:

      • So the question is whether or not you can throw an error in JavaScript without using throw。它在哪里没有说明自定义错误。请更新问题
      • 我喜欢这个答案,因为它鬼鬼祟祟。这个问题在抽象意义上很有趣,但我想问“当错误发生时,什么样的情况需要我们避免抛出错误?”理想情况下,应该发现并修复错误的代码,因此编程错误似乎并不适用于此,但是可能需要在应用程序继续运行时识别、处理和解决例如输入或流式错误 - 这就是这样的地方可能派上用场。
      【解决方案5】:

      生成器确实有一个throw 方法,该方法通常用于向生成器函数代码中抛出异常(在yield 表达式的位置,类似于next),但如果没有被捕获,它就会冒泡电话:

      (function*(){})().throw(new Error("example"))
      

      当然,这是一个 hack 并且不是很好的风格,我不知道他们期望什么答案。尤其是“不被零除”的要求是粗略的,因为被零除不会在 JS 中引发异常。

      【讨论】:

      • @Konowy 只是好奇,您是否有一个真实的用例,或者是否有一个关于这个的流行测验?
      • 没有。我只是将这段代码用于这个 kata codewars.com/kata/5970f479e75b6c00ce000043 我不相信会有一个真实的例子。
      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 2014-03-19
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多