`try-catch-finally`의 `finally` 블록은 항상 실행됩니다.

5106 단어 kotlinjavajavascript
이 문서에서는 Javascript 예제를 보여줍니다. Javascript, Java 및 Kotlin에서 이것을 시도했습니다. 내 개인의 Kotlin 중심 접근 방식 blog .


최근에 소스 코드를 탐색하다가 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 the finally-block execute even if no catch-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가 반환되지 않습니다.

좋은 웹페이지 즐겨찾기