promise 'catch'를 사용하여 Promise에서 발생한 오류를 포착 할 수 없습니다.

비탈리 스크립 카

이 코드가 있습니다.

new Promise(() => {
  setTimeout(() => { throw new Error('ERROR') }, 1000);
}).catch(err => {
  console.log('CATCHED ', err);
});

그리고 setTimeout에서 발생하는 오류를 포착하지 않습니다. 왜?

tmdesigned

내 의견에 대한 귀하의 의견은 사례가 다른 답변과 다르다고 제안했습니다. 이 설명을 주석에 넣을 수 없으므로 다음과 같습니다.

실제로 catch 블록은 promise가 거부 할 때까지 기다리지 않습니다 . 이 시도:

const myPromise = new Promise(() => {
  console.log('inside of the promise');
  setTimeout(() => { console.log('inside of the timeout function'); throw new Error('ERROR') }, 1000);
}).catch(err => {
  console.log('CATCHED ', err);
});
console.log('outside of the catch block, and my promise is', myPromise);

타임 아웃 함수 내부의 메시지 이전에 catch 메시지 외부가 콘솔에 기록되는 것을 알 수 있습니다. 이 시점에서 약속이 해결되지 않았습니다 (보류 중).

setTimeout을 사용하면 함수가 JavaScript의 대기열 끝에 추가됩니다.

편집하다

약속에 대해 거부를 호출하여이 문제를 해결할 수 있습니다.

const myPromise = new Promise((resolve,reject) => {
  setTimeout(() => { reject('ERROR'); }, 1000);
}).catch(err => {
  console.log('CAUGHT ', err);
});

이 경우 거부 기능이 스코프 버블 (클로저)에 유지되므로 여전히 해결할 수 있기 때문에 다릅니다.

2 편집

이에 대한 의견에서 토론이있는 또 다른 질문을 찾았습니다.

자바 스크립트 약속-거부 대 던지기

이것으로 설명을 수정하겠습니다.

첫째, 약속에 연결 하는 catch 함수catch 블록을 마음에 따로 두는 것이 좋습니다 . Promise는 내장 된 보이지 않는 catch 블록을 사용하여 발생한 오류를 포착하는 것으로 생각하십시오 . 이를 처리 할 때 promise의 catch 블록 은 catch 함수를 트리거하는 'reject'를 호출 합니다 .

오류 발생 => promise의 보이지 않는 (암시 적) catch 블록 => reject () => promise의 catch () 함수

그러나 setTimeout과 함께 다른 호출 스택에서 오류가 발생하면이를 잡을 수 없습니다.

throw 된 오류 (setTimeout의 다른 호출 스택에서) => 잡히지 않은 예외

예외가 다른 호출 스택에서 버블 링되기 때문에 체인이 중지됩니다.

그러나 위의 코드 스 니펫이 수행하는 작업 인 catch 함수를 트리거하여 여전히 reject를 호출 할 수 있습니다.

거부 => 약속의 catch () 함수

이벤트 체인이 더 짧아 원하는 동작 (catch 함수에서 코드 트리거)으로 바로 절단됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

promise 'catch'를 사용하여 Promise에서 발생한 오류를 포착 할 수 없습니다.

분류에서Dev

하나의 Try / Catch를 사용하여 테스트 할 여러 항목을 포함하고 오류가 발생한 위치에 따라 catch에서 다른 작업을 수행 할 수 있습니까?

분류에서Dev

try / catch를 사용하여 Async / Await 함수에서 Promise.all을 어떻게 사용할 수 있습니까?

분류에서Dev

RxJS catchError 연산자는 Promise에서 생성 된 Observable에서 오류를 포착하지 않습니다.

분류에서Dev

.catch () 메서드가 포함 된 Promise를 테스트 할 때 오류 발생

분류에서Dev

다른 함수 내에서 promise 함수를 호출 할 때 오류 발생

분류에서Dev

약속은 비동기 함수에서 발생한 오류를 포착하지 않습니다.

분류에서Dev

내 코드에서 발생하지 않은 JavaScript 오류를 포착 할 수 있습니까?

분류에서Dev

관찰자는 동적 확장 메서드에서 발생한 예외를 포착 할 수 없습니다.

분류에서Dev

PHP-Google API 라이브러리에서 발생한 예외를 포착 할 수 없습니다.

분류에서Dev

HttpWebRequest 응답에서 404 오류를 포착 할 수 없습니다.

분류에서Dev

chrome-cookies-secure 모듈을 사용하여 Node.js 앱에서 Promise를 해결할 수 없습니다.

분류에서Dev

Promise, catch 및 gulp를 사용하여 dist 폴더에 파일을 쓸 수 없습니다.

분류에서Dev

Remove-ServiceFabricNodeState를 사용하여 오류가 발생한 노드를 더 이상 제거 할 수 없습니다.

분류에서Dev

mocha nodejs에서 테스트 할 함수에서 발생한 오류를 지정할 수 없습니다. expect.to.throw (오류)가 작동하지 않습니다.

분류에서Dev

ORACLE에서 구문 오류를 포착 할 수 있습니까?

분류에서Dev

서버에서 예외를 포착 할 수 없습니다.

분류에서Dev

모듈 내에서 FormattedMessage를 사용할 때 오류가 발생합니다. 오류 : [React Intl] 필요한`intl` 개체를 찾을 수 없습니다.

분류에서Dev

WMIC를 사용했는데 오류가 발생했습니다. RPC 서버를 사용할 수 없습니다.

분류에서Dev

iOS 8에서 선택한 장치 오류를 사용하여 Xcode를 실행할 수 없습니다.

분류에서Dev

React-Promise with Edge를 사용할 때 오류를 구문 분석 할 수 없습니다.

분류에서Dev

최신 xcode에서 lvalue를 사용하여 유형의 매개 변수를 초기화 할 수 없습니다. 오류가 발생합니다.

분류에서Dev

PHP는 포함 된 파일 내에서 오류를 포착 할 수 없습니다.

분류에서Dev

각도에서 async / await를 사용할 때 전역 예외를 포착 할 수 없습니다.

분류에서Dev

오류 발생 : Route의 Route ()를 문자열에 적용 할 수 없습니다.

분류에서Dev

eval () 오류를 사용하여 텐서를 평가할 수 없습니다.

분류에서Dev

matlab에서 parfor를 사용하는 동안 오류가 발생했습니다. // parfor의 변수를 분류 할 수 없습니다.

분류에서Dev

"bindParam ()"오류가 발생하는 "execute ()"를 사용하여 내 PDO 쿼리를 실행할 수 없습니다.

분류에서Dev

Aurelia에서 Promise를 어떻게 사용할 수 있습니까?

Related 관련 기사

  1. 1

    promise 'catch'를 사용하여 Promise에서 발생한 오류를 포착 할 수 없습니다.

  2. 2

    하나의 Try / Catch를 사용하여 테스트 할 여러 항목을 포함하고 오류가 발생한 위치에 따라 catch에서 다른 작업을 수행 할 수 있습니까?

  3. 3

    try / catch를 사용하여 Async / Await 함수에서 Promise.all을 어떻게 사용할 수 있습니까?

  4. 4

    RxJS catchError 연산자는 Promise에서 생성 된 Observable에서 오류를 포착하지 않습니다.

  5. 5

    .catch () 메서드가 포함 된 Promise를 테스트 할 때 오류 발생

  6. 6

    다른 함수 내에서 promise 함수를 호출 할 때 오류 발생

  7. 7

    약속은 비동기 함수에서 발생한 오류를 포착하지 않습니다.

  8. 8

    내 코드에서 발생하지 않은 JavaScript 오류를 포착 할 수 있습니까?

  9. 9

    관찰자는 동적 확장 메서드에서 발생한 예외를 포착 할 수 없습니다.

  10. 10

    PHP-Google API 라이브러리에서 발생한 예외를 포착 할 수 없습니다.

  11. 11

    HttpWebRequest 응답에서 404 오류를 포착 할 수 없습니다.

  12. 12

    chrome-cookies-secure 모듈을 사용하여 Node.js 앱에서 Promise를 해결할 수 없습니다.

  13. 13

    Promise, catch 및 gulp를 사용하여 dist 폴더에 파일을 쓸 수 없습니다.

  14. 14

    Remove-ServiceFabricNodeState를 사용하여 오류가 발생한 노드를 더 이상 제거 할 수 없습니다.

  15. 15

    mocha nodejs에서 테스트 할 함수에서 발생한 오류를 지정할 수 없습니다. expect.to.throw (오류)가 작동하지 않습니다.

  16. 16

    ORACLE에서 구문 오류를 포착 할 수 있습니까?

  17. 17

    서버에서 예외를 포착 할 수 없습니다.

  18. 18

    모듈 내에서 FormattedMessage를 사용할 때 오류가 발생합니다. 오류 : [React Intl] 필요한`intl` 개체를 찾을 수 없습니다.

  19. 19

    WMIC를 사용했는데 오류가 발생했습니다. RPC 서버를 사용할 수 없습니다.

  20. 20

    iOS 8에서 선택한 장치 오류를 사용하여 Xcode를 실행할 수 없습니다.

  21. 21

    React-Promise with Edge를 사용할 때 오류를 구문 분석 할 수 없습니다.

  22. 22

    최신 xcode에서 lvalue를 사용하여 유형의 매개 변수를 초기화 할 수 없습니다. 오류가 발생합니다.

  23. 23

    PHP는 포함 된 파일 내에서 오류를 포착 할 수 없습니다.

  24. 24

    각도에서 async / await를 사용할 때 전역 예외를 포착 할 수 없습니다.

  25. 25

    오류 발생 : Route의 Route ()를 문자열에 적용 할 수 없습니다.

  26. 26

    eval () 오류를 사용하여 텐서를 평가할 수 없습니다.

  27. 27

    matlab에서 parfor를 사용하는 동안 오류가 발생했습니다. // parfor의 변수를 분류 할 수 없습니다.

  28. 28

    "bindParam ()"오류가 발생하는 "execute ()"를 사용하여 내 PDO 쿼리를 실행할 수 없습니다.

  29. 29

    Aurelia에서 Promise를 어떻게 사용할 수 있습니까?

뜨겁다태그

보관