throw Error(error);
, это просто работает, потому что JS всегда выполняет собственные конструкторы как конструкторы, даже если вы вызываете их как функцию. Это похоже на вставку точки с запятой, хотя она работает, я бы не рекомендовал полагаться на нее, потому что это сбивает с толку и может привести к нежелательным побочным эффектам. В принципе, если все работает так, как ожидалось, это так же, как:
throw new Error(error);
Теперь это также не имеет особого смысла, поскольку вы теряете трассировку стека error
s. Когда создается объект ошибки, собирается много информации о том, как произошла ошибка, что действительно полезно для отладки. Поскольку конструктор ошибок ожидает строку в качестве первого аргумента, error
преобразуется в строку, в основном это:
throw new Error(error.toString());
и строковым образом вы сохраняете сообщение и теряете все остальное. Вы получаете сообщение об ошибке, которое происходит в строке выше, которая скрывает место, откуда она возникла, тогда как:
throw error;
просто передает ошибку, которая сохранит всю обязательную информацию.
Для ясности, я лично предпочитаю не смешивать Canables и async / await, поэтому я бы сделал:
try {
const response = await api.call()
} catch(error) {
// Some logging, handling, etc.
throw error;
}
Если вы не можете правильно обработать ошибку и всегда выбросить ее, это бессмысленно, просто не надо try
до catch
ее. Обрабатывайте его где-нибудь в стеке вызовов, где вы действительно можете его обработать.