웹사이트 검색

자바스크립트에서 프로미스 런타임 오류를 잡는 방법은?


저는 현재 PDF.js를 기반으로 PDF 뷰어를 구현하고 있으며, 그 과정에서 프로미스 객체에 대해 배웠습니다.

저는 또한 런타임 오류가 디버깅 콘솔에 자동으로 표시되지 않는다는 것을 배웠습니다:

PDFJS.getDocument(...).then(
  function(pdfDocument){
    alert(UndefinedVariable); // Not shown in console!
  },
  function(error){
    console.log("Error occurred", error);
  }
);

저는 PDF.js에는 작동하지 않는 http://www.asyncdev.net/2013/07/promises-errors-and-express-js/에 설명된 것처럼 .done()를 추가하는 것 외에는, promise 함수에서 런타임 오류를 예쁘게 보여줄 방법을 찾지 못했습니다. 또는 .catch(function(error){ console.error(error); })를 추가하는 방법이 있습니다.

나는 디버거에서 런타임 오류로 인한 예외에서 중단할 수 있다는 것을 알고 있지만, 그렇게 하면 다른 예외(jQuery에서도)에서도 중단이 발생하기 때문에, 내 코드에 런타임 오류가 있는지 확인하기 전에 매 페이지 로드마다 5개의 jQuery 예외를 거쳐야 한다.

모든 함수 호출마다 추가 코드를 작성하지 않고도 프로미스 함수가 일반적으로 런타임 오류를 로그하도록 강제할 수 있는 방법이 있을까요?

답변 #1

당신이 겪고 있는 문제는 then 콜백에서 발생한 예외가 전달한 에러 핸들러를 호출하는 대신 .then()이 반환한 프라미스를 거부한다는 것입니다. 이는 당신이 .then()을 호출한 프라미스에서만 오류가 발생할 경우에만 작동합니다. 따라서 핸들러를 체인할 수 있습니다:

PDFJS.getDocument(...).then(function(pdfDocument){
    alert(UndefinedVariable); // Now shown in console!
}).then(null, function(error){
    console.log("Error occurred", error);
});

여기서, then(null, …)은 catch(…)로 축약될 수도 있습니다.

오류 발생 시 throws하는 done 메서드가 없다면, setTimeout에서 throw하여 직접 이렇게 구현할 수 있습니다.

모든 함수 호출마다 추가 코드를 작성하지 않고도 프로미스 함수가 일반적으로 런타임 오류를 로그하도록 강제할 수 있는 방법이 있을까요?

아니요. 그건 그냥 원래 그렇게 설계된 것이 아닙니다.

답변 #2

Promise 구현에서, try ... catch가 있어 콜백에서 발생한 오류를 가져와 Promise에 의해 반환되는 오류로 변환합니다.

할 수 있는 한 가지 방법은 그 try...catch를 변경하여 프로미스의 실패를 호출하기 전에 오류를 기록하는 것입니다.

https://github.com/mozilla/pdf.js/blob/master/src/shared/util.js#L936

    } catch (ex) {
      console.error(ex); // <--- add this line
      nextStatus = STATUS_REJECTED;
      nextValue = ex;
    }

대신 네이티브 ECMAScript 6 프로미스를 사용하면, 이 방법은 아마 작동하지 않을 것입니다.