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;
});
튜토리얼에서는 사람들에게 오류를 포착 할 수있는 위치를 보여 주거나 오류 처리 개념을 가르치고 다시 던지기 위해있을 수 있습니다.
잡기 및 다시 던지기에 대한 몇 가지 유용한 이유는 다음과 같습니다.
- 오류 를 기록하고 싶지만 약속 체인을 거부 된 상태로 유지합니다.
- 당신은 할 몇 가지 다른 오류에 오류를 켭니다 (체인의 끝에서 종종 쉽게 오류 처리를 위해). 이 경우 다른 오류가 다시 발생합니다.
- 약속 체인이 계속되기 전에 (예 : 닫기 / 사용 가능한 리소스) 많은 처리 를 수행하고 싶지만 약속 체인이 거부 된 상태로 유지되기를 원합니다.
- 실패가있는 경우 약속 체인의이 지점에서 디버거 에 대한 중단 점을 배치 할 지점을 원합니다 .
그러나 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
'IT박스' 카테고리의 다른 글
Java 8로 무한 스트림을 만드는 방법 (0) | 2020.11.15 |
---|---|
RC.1에서는 바인딩 구문을 사용하여 일부 스타일을 추가 할 수 없습니다. (0) | 2020.11.15 |
함수에서 char *와 char []를 반환하는 것의 차이점은 무엇입니까? (0) | 2020.11.15 |
PHP의 Structs 데이터 유형? (0) | 2020.11.14 |
객체 / 인스턴스 / 변수의 존재를 우아하게 확인하고 파이썬에 존재하는 경우 변수에 동시에 할당하는 방법은 무엇입니까? (0) | 2020.11.14 |