Как перехватывать все ошибки в приложении, если некоторые функции уже обернуты в try ... catch?

Как правильно перехватывать ошибки приложения в одном месте, если некоторые функции уже обернуты в try catch ?
Интересует как back, так и front.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 3
IonDen
@IonDen Куратор тега JavaScript
JavaScript developer. IonDen.com
Для этого существует `catch`, вызывайте в нем свою функцию. Примерно так:
https://jsfiddle.net/g9xwf42h/

function parseError(er) {
    console.log(er);
}


try {
    var a = "test";
    alert(a.b.c);
} catch (er) {
    parseError(er);
}



try {
    var b = "test2";
    alert(b.c.d);
} catch (er) {
    parseError(er);
}
Ответ написан
bootd
@bootd
Гугли и ты откроешь врата знаний!
Юзаю nuxt.axios
Плагин для axios у меня, который обрабатывает ошибки
/plugins/axios.js
export default ({ $axios, error, $auth }) => {
  $axios.onError(({ response }) => {
    const statusCode = response.status
    const message = response.data.message

    switch (statusCode) {
      case 401:
        $auth.logout()
        break

      case 422:
        break

      case 500:
        break

      default:
        error({
          statusCode,
          message,
        })
    }
  })
}

Каждый статус код в конструкции switch позволяет приложению не падать, а работать дальше, что бы вы смогли в месте, где вызываете метод, вернувший ошибку что либо сделать. Или же, как у меня в случае с ошибкой 401 написать свою логику.

Далее, в компоненте где используется функция для запроса:
/pages/sign-in.vue
export default {
  methods: {
    async onSignIn () {
      try {
        await this.$auth.signIn(...)
      } catch (error) {
        this.showErrors(error)
      }
    },
  }
}


Само тело функции
async signIn ({ username, password }) {
    const { token, expireAt, user } = await $axios.$post(..., {
      username,
      password,
    })
    //....
  }


В итоге получаем, что вызвав в компоненте асинхронный метод, в нём же и обрабатываю ошибки, выводя их в специальных окошечках для уведомлений
Ответ написан
Xuxicheta
@Xuxicheta
инженер
Правильный ответ - не нужно все ошибки обрабатывать в одном месте.
А вообще если нужна промежуточная обработка ошибок, делают проброс ошибки дальше
function mayBeError() {
  try {
    throw new Error('iiii')
  } catch (e) {
    console.error('error in mayBeError');
    throw e;
  }
}

Функции должны выкидывать свои ошибки вовне, это нормально.

Централизованного способа нет и было бы странно если бы он был, иногда исключений просто куча. Их могут в логике использовать.

Можно только неперехваченные ошибки ловить, через
для браузера событие error
window.onerror = function (message, file, line, col, error) {
   console.warn("Error occurred: " + error.message);
   return false;
};

и для ноды событие uncaughtException
https://nodejs.org/api/process.html#process_event_...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight Куратор тега JavaScript
https://sitecoder.blogspot.com
Добавить break point на catch (остальное - как обычно).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Enapter Санкт-Петербург
от 160 000 до 240 000 ₽
Junto Москва
от 120 000 до 180 000 ₽