`try-catch-finally`의 `finally` 블록은 항상 실행됩니다.
5106 단어 kotlinjavajavascript
최근에 소스 코드를 탐색하다가 Mutex를 구현하는 코드를 발견했습니다.
다음은 (kotlinx-couroutines-core에서)
lock(owner)
try {
return action()
} finally {
unlock(owner)
}
finally
블록 내의 return action()
가 실행되면 try
블록 내의 mutex 잠금을 어떻게 해제할지 궁금합니다.나는 전에
finally
블록을 작성한 적이 없으므로 이것이 나를 약간 혼란스럽게 만들었습니다.검색 결과 많은 사람들이 이러한 상황을 겪었습니다. 약 2.4k upvotes가 있고 ~ 500 번 북마크 된 question in StackOverflow이 있습니다.
그건 진실이야.
finally
블록은 StackOverflow 질문의 accepted answer에 언급된 프로세스가 종료되는 것과 같은 예기치 않은 상황을 제외하고 항상 실행됩니다.나는 MDN documentation을 찾았고 이것을 발견했습니다.
"Note that the
finally
-block executes regardless of whether an exception is thrown. Also, if an exception is thrown, the statements in thefinally
-block execute even if nocatch
-block handles the exception."
try 블록을 사용해 봅시다!
그래서 다음을 테스트하기 위해 small JSBin snippet을 만들었습니다.
function tryExample(){
try{
return "Returned from try{}";
} finally {
console.log("Inside finally{}");
}
}
console.log(tryExample());
이 코드는 다음을 인쇄합니다:
Inside finally{}
Returned from try{}
한 가지 더, 마침내 무언가를 반환하면 try 블록 내에서 반환이 작동하지 않습니다.
내가 LinkedIn에 이것을 게시했을 때 내 동료Afsal는 또 다른 흥미로운 점을 지적했습니다.
finally
블록에서 돌아오면 return
블록 내의 try
문이 실행되지 않습니다.그것은 또 다른 발견이었습니다.
다음을 테스트하기 위해 another JSBin snippet을 만들었습니다.
function finallyReturnsExample(){
try{
return "Returned from try{}"
} finally {
console.log("Inside finally{}")
return "Returned from finally{}"
}
}
console.log(finallyReturnsExample());
출력은 다음과 같습니다.
Inside finally{}
Returned from finally{}
따라서 새로운 교훈을 얻었습니다.
finally
블록은 항상 실행되며(몇 가지 조건 제외) finally
블록이 반환되면 try
/catch
가 반환되지 않습니다.
Reference
이 문제에 관하여(`try-catch-finally`의 `finally` 블록은 항상 실행됩니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vishnuharidas/the-finally-block-in-try-catch-finally-executes-always-5cnf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)