Acompanhe as promessas Q rejeitadas não tratadas

Há uma regra no Q (e outras bibliotecas prometidas em implementação .done()) que evita muita frustração de depuração:

A regra de ouro da donevs. thenuso é: ou returna sua promessa de
outra pessoa, ou se as extremidades da cadeia com você, ligue donepara encerrá-la.

Depois de alguma prática, é fácil e natural segui-lo, mas, como qualquer outra tarefa manual, ainda está sujeito a erros.

Felizmente, Q mantém um registro das promessas falhadas não tratadas para que tenhamos a chance de fazer algo com elas. Como uma promessa pode ser cumprida muito depois de ser criada, há apenas um momento em que sabemos com certeza que uma promessa não foi cumprida: quando a página descarrega.

Com isso em mente, por exemplo, podemos lançar o primeiro erro não tratado no loop de eventos para que seja tratado como qualquer outro erro lançado fora de uma promessa:

// Throw the first unhandled rejected Q promise
window
.addEventListener('beforeunload', function () {
Q
.getUnhandledReasons().forEach(function (error) {
throw error;
});
});

Normalmente, por padrão, o navegador mostrará o erro no console, mas você pode fazer o que quiser substituindo window.onerror.

Notas extras

  • alert não funciona durante o descarregamento, use event.returnValue = 'message'
  • As solicitações Ajax devem ser síncronas para garantir que sejam executadas. Por exemplo, Bugsnag parece rastrear erros sendo lançados durante o descarregamento, mas Sentry não.