IT박스

Promise catch에서 오류 다시 던지기

itboxs 2020. 11. 15. 11:02
반응형

Promise catch에서 오류 다시 던지기


튜토리얼에서 다음 코드를 찾았습니다.

promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});

나는 약간 혼란 스럽습니다. catch 호출이 어떤 일을 수행합니까? 그것은 단순히 잡힌 것과 같은 오류를 던지기 때문에 아무런 영향을 미치지 않는 것 같습니다. 나는 이것을 정규적인 try / catch가 어떻게 작동하는지에 기초한다.


당신이 보여줄 때 알몸으로 잡고 던지는 것은 의미가 없습니다. 코드 추가 및 느린 실행 외에는 유용한 작업을 수행하지 않습니다. 따라서 다시 .catch()던지려는 경우에서 원하는 작업 .catch()이 있어야 합니다 . 그렇지 않으면 .catch()전체를 제거해야합니다 .

일반적인 구조의 일반적인 요점 .catch()은 오류를 기록하거나 파일 닫기와 같은 일부 상태를 정리 하는 것과 같은 작업 을 실행 하려고하지만 약속 체인이 거부 된 상태로 계속되기를 원할 때입니다.

promise.then(function(result){
    //some code
}).catch(function(error) {
    // log and rethrow 
    console.log(error);
    throw error;
});

튜토리얼에서는 사람들에게 오류를 포착 할 수있는 위치를 보여 주거나 오류 처리 개념을 가르치고 다시 던지기 위해있을 수 있습니다.


잡기 및 다시 던지기에 대한 몇 가지 유용한 이유는 다음과 같습니다.

  1. 오류기록하고 싶지만 약속 체인을 거부 된 상태로 유지합니다.
  2. 당신은 할 몇 가지 다른 오류에 오류를 켭니다 (체인의 끝에서 종종 쉽게 오류 처리를 위해). 이 경우 다른 오류가 다시 발생합니다.
  3. 약속 체인이 계속되기 전에 (예 : 닫기 / 사용 가능한 리소스) 많은 처리수행하고 싶지만 약속 체인이 거부 된 상태로 유지되기를 원합니다.
  4. 실패가있는 경우 약속 체인의이 지점에서 디버거대한 중단 점을 배치 할 지점을 원합니다 .

그러나 catch 핸들러에 다른 코드가없는 동일한 오류를 일반 catch 및 rethrow는 정상적인 코드 실행에 유용한 작업을 수행하지 않습니다.


.then().catch()메서드는 모두 Promises를 반환하며, 두 핸들러 중 하나에서 Exception을 throw하면 반환 된 promise가 거부되고 다음 거부 핸들러에서 예외가 포착됩니다.

다음 코드에서는 첫 번째 예외가 발생하고 두 번째 예외가 발생 .catch()합니다 .catch().

new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');
        
    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
});

두 번째 .catch()는 이행 된 Promised를 반환하고 .then()핸들러를 호출 할 수 있습니다.

new Promise((resolve, reject) => {
    console.log('Initial');

    resolve();
})
.then(() => {
    throw new Error('Something failed');
        
    console.log('Do this'); // Never reached
})
.catch(() => {
    console.log('Something failed');
    throw new Error('Something failed again');
})
.catch((error) => {
    console.log('Final error : ', error.message);
})
.then(() => {
    console.log('Show this message whatever happened before');
});

유용한 참조 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch

도움이 되었기를 바랍니다!


catch메서드 호출을 완전히 생략해도 중요한 차이는 없습니다 .

The only thing it adds is an extra microtask, which in practice means you'll notice the rejection of the promise later than is the case for a promise that fails without the catch clause.

The next snippet demonstrates this:

var p;
// Case 1: with catch
p = Promise.reject('my error 1')
       .catch(function(error) {
          throw(error);
       });

p.catch( error => console.log(error) );
// Case 2: without catch
p = Promise.reject('my error 2');

p.catch( error => console.log(error) );

Note how the second rejection is reported before the first. That is about the only difference.


So it sounds like your question is, "In the promise chain, what does the .catch() method do?"

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

The throw statement "will stop (the statements after throw won't be executed), and control will be passed to the first catch block in the call stack. If no catch block exists among caller functions, the program will terminate."

In the promise chain, the .then() method will return some type of data chunk. This return of the chunk will complete the promise. The successful return of the data completes the promise. You can think of the .catch() method in the same way. .catch() however will handle unsuccessful data retrieves. The throw statement completes the promise. Occasionally, you will see developers use .catch((err) => {console.log(err))} which would also complete the promise chain.

참고URL : https://stackoverflow.com/questions/42167274/rethrowing-error-in-promise-catch

반응형