Как скинуть ошибку без скина - PullRequest
0 голосов
/ 28 мая 2018

Так недавно мне задали вопрос :

Есть ли способ выдать ошибку без использования throw в javaScript?

Насколько я зналЧто касается ошибок, был только один способ вызвать ошибку в JavaScript, и это было использование оператора throw в JavaScript, например, так:

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.Но теперь мне интересно, был ли я прав?

Так что вопрос в том, можно ли выкинуть ошибку custom в JavaScript без использования throw


Ограничения:

  • Пожалуйста, не используйте eval, Function.
  • Не используйте throw в своем коде

Дополнительно:

Если вы можете выдать ошибку, не используя слово Error

Ответы [ 5 ]

0 голосов
/ 07 июня 2018
const myTypeErr = () => `This is a Custom Err Message... \nand it`()

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

myTypeErr() // Uncaught TypeError: "This is a Custom Err Message... 
              // and it" is not a function
0 голосов
/ 07 июня 2018

Думаю, если вы хотите использовать блоки try...catch, вам нужно будет что-то бросить, чтобы добраться до части catch.Для этого вы можете использовать практически все, что не получается, с ошибкой (как упоминалось в других статьях).

Если в какой-то момент вы захотите запустить или умереть , не имеячтобы написать оператор броска самостоятельно, вы всегда можете сделать утверждение:

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

Конечно, я предпочел бы попытаться утверждать что-то положительное (больше дзен), что мне нужно для продолжения.

0 голосов
/ 31 мая 2018

Если все, что вы хотите сделать, это выдать ошибку, просто выполните недопустимую операцию.Я перечислил несколько ниже.Запустите их в консоли браузера, чтобы увидеть ошибки (проверено на chrome и firefox).

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


try {
  myFunc()
}catch(e) {
  console.log(e);
}
0 голосов
/ 03 июня 2018

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);
  });
0 голосов
/ 28 мая 2018

Генераторы имеют метод throw, который обычно используется для выброса исключения в код функции генератора (в месте выражения yield, аналогично next), но если его не поймать, он выходит иззвонок:

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

Конечно, это хак и не очень хороший стиль, я понятия не имею, какой ответ они ожидали.В частности, требование «без деления на ноль» является схематичным, поскольку деление на ноль в любом случае не вызывает исключений в JS.

...