try / catch 블록 내의 return 문은 어떻게 작동합니까?
function example() {
try {
return true;
}
finally {
return false;
}
}
이 함수의 출력이 될 것으로 예상하고 true
있지만 대신 false
!
답변:
마지막으로 항상 실행됩니다. 그것은 그것이 당신의 경우에 사용된다는 것을 의미합니다.
코드를 다음과 같이 변경하고 싶을 것입니다.
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
일반적으로 함수에 하나 이상의 return 문을 갖고 싶지는 않습니다. 이런 이유가 있습니다.
ECMA-262 (2009 년 12 월 5 일)에 따르면 96 페이지 :
생산
TryStatement : try Block Finally
은 다음과 같이 평가됩니다.
- B를 Block 평가의 결과라고하자.
- F를 마지막으로 평가 한 결과라고합시다.
- F.type이 정상이면 B를 반환합니다.
- F를 반환합니다.
그리고 pp. 36에서 :
완료 타입 (명령문의 동작을 설명하는 데 사용되는
break
,continue
,return
및throw
제어 비 로컬 전송을 수행). 완료 유형의 값이 형태의 트리플이다 (타입 값, 타겟) , 유형 중 하나 인normal
,break
,continue
,return
, 또는throw
, 값이 임의 인 ECMAScript 언어 값 또는 빈이며, 타겟은 임의의 ECMAScript를 식별자 또는 빈이다.
그것은 그 분명 return false
완료 유형을 설정합니다 마지막 으로 반환 유발 try ... finally
할 4. 반환 F를 .
왜 당신이 거짓인지는 finally 블록에서 반환됩니다. finally 블록은 항상 실행되어야합니다. 그래서 당신의 return true
변경return false
function example() {
try {
return true;
}
catch {
return false;
}
}
finally 블록은 try 블록 반환을 다시 작성합니다 (비상 적으로 말하면).
마지막으로 무언가를 반환하면 함수에서 반환된다는 점을 지적하고 싶었습니다. 그러나 마지막으로 'return'단어가 없으면 try 블록에서 값을 반환합니다.
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
그래서 return
-finally-는 -try-의 반환을 다시 작성합니다 return
.
여기서 약간 다른 대답을하겠습니다. 예, try
및 finally
블록이 모두 실행되고 finally
함수의 실제 "반환"값보다 우선합니다. 그러나 이러한 반환 값이 코드에서 항상 사용되는 것은 아닙니다.
그 이유는 다음과 같습니다.
res.send()
는 HTTP 응답을 생성하고 디스패치하는 Express.js에서 합니다.try
와 finally
블록은 모두 다음 과 같이이 함수를 실행합니다.try {
// Get DB records etc.
return res.send('try');
} catch(e) {
// log errors
} finally {
return res.send('finally');
}
이 코드는 try
브라우저에 문자열 을 표시합니다. 또한 예제는 콘솔에 오류를 표시합니다. 이 res.send()
함수는 두 번 호출 됩니다 . 이것은 함수 인 모든 경우에 발생합니다. try-catch-finally 블록은 (개인적으로) return
값을 함수 범위와 만 연관시키기 때문에 훈련되지 않은 눈으로이 사실을 난독 화합니다 .
Imho 최선의 방법은 블록 내부에서 사용하지 않는 것return
finally
입니다. 코드가 지나치게 복잡해지고 잠재적으로 오류를 가릴 수 있습니다.
실제로 PHPStorm에는 이에 대한 "경고"를 제공하는 기본 코드 검사 규칙 설정이 있습니다.
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
finally
합니까?나는 finally
물건을 청소 하는 데 에만 사용 합니다. 함수의 반환 값에 중요하지 않은 모든 것.
에서 코드 줄에 의존 할 때 또는에 finally
오류가있을 수 있다고 가정하기 때문에 생각해 보면 이해할 수 있습니다 . 그러나 마지막 2 개는 오류 처리의 실제 구성 요소입니다. 그냥를 사용 으로 하고 대신.try
catch
return
try
catch
finally- 블록에서 복귀
는 IF
finally
- 블록은 값을 반환,이 값은 전체의 반환 값이됩니다try-catch-finally
어떤 관계없이 문을return
에서 문try
및catch
-blocks