Попробуйте поймать не работает, даже если происходит ошибка - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть некоторый код, который выполняется при отправке формы. Он отправляет сообщения по маршруту API.

  handleSubmit = async () => {
    try {
      const response = await fetch(`${API_URL}/project`, {
        method: "post",
        body: JSON.stringify({
          name: this.state.name,
          description: this.state.description
        }),
        headers: { "Content-Type": "application/json" }
      });
      return response ? response.json() : response;
    } catch (error) {
       console.log(error)
    }
  };

Проблема заключается в том, что при тестировании я меняю маршрут API на намеренно недопустимый маршрут, чтобы вызвать ошибку. Однако код улова не получен. Я неправильно настроил пробную версию?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что получение 404 не является исключением. Чтобы справиться с этим, вы должны добавить некоторый код, который проверит код состояния ответа и оттуда определит, что должно быть сделано. Например, вы получите ответ и будете использовать следующее:

if(response.status == 404)
    //Code for not receiving the content you expect

Проблема в том, что есть много потенциальных ответов, которые вы можете получить, но которые не будут соответствовать вашим ожиданиям, поэтому я бы порекомендовал занести в белый список определенные диапазоны ответов, а не искать те, которые являются проблемой. Например

if(response.status >= 200 && response.status <= 299)
    //Code to run when you receieve a good response

Это пример, от вас зависит, какие ответы вы хотите обработать.

0 голосов
/ 17 апреля 2019

Если вам нужно получить конкретную ошибку, вы должны следовать следующим образом:

handleSubmit = () => {
    fetch(`${API_URL}/project`, {
        method: "post",
        body: JSON.stringify({
            name: this.state.name,
            description: this.state.description
        }),
        headers: { "Content-Type": "application/json" }
    }).then((response) => {
        return response ? response.json() : response;
    }).catch((error) => {
        console.log(`fetch specific error: ${error}`)
    });
};
0 голосов
/ 17 апреля 2019

fetch выдает ошибку только в том случае, если была ошибка при получении или получении ответа.HTTP 404 должен рассматриваться как «успешный» ответ, и пользователь сам должен решить, что делать с таким ответом.

Если вы хотите отклонить не-20x ответы, и у вас уже есть бизнес-логика дляобработав ошибку в вашем catch коде, вы можете выдать новую ошибку и обработать ее вместе с другими ошибками:

try {
    const response = await fetch(`${API_URL}/project`, {
    ...
    if (response.status >= 200 && response.status < 300) {
        return response.json()
    } else {
        var error = new Error(response.statusText || response.status)
        error.response = response
        throw(error)
    }
} catch (error) {
   console.log(error)
}
...