try catch finally 블록 내에서 돌아 오는 것은 나쁜 습관입니까?


128

그래서 오늘 아침에 다음과 같은 코드를 보았습니다.

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

이제이 코드는 정상적으로 컴파일되고 정상적으로 작동하지만 try 블록 내에서 돌아 오는 것이 옳지 않습니다. 특히 마지막으로 연결된 경우.

내 주요 문제는 마침내 자신의 예외를 던지면 어떻게됩니까? 반환 된 변수뿐만 아니라 처리해야 할 예외가 있습니다. 따라서 try 블록 내에서 반환하는 것에 대해 다른 사람들이 어떻게 생각하는지 알고 싶습니다.


13
이 스타일의 장점 중 하나 xtry블록 외부에서 선언 할 필요가 없다는 것 입니다. 선언을 사용에 가깝게 유지할 수 있습니다.
David R Tribble

답변:


169

아니요, 나쁜 습관이 아닙니다. 퍼팅 return은 감각 가독성과 유지 보수성을 향상하고 이해하기 코드를 간단하게 만드는 곳. 명령문이 발생 finally하면 블록이 실행되므로 주의하지 않아도 return됩니다.


19

마지막은 무엇이든 상관없이 실행되므로 중요하지 않습니다.


9
아니요, 실제로 플러그를 꽂는 것이 아니라 StackOverflowException, ThreadAbortException 및 OutOfMemoryException과 같은 비동기 예외라는 예외가있어 finally 블록이 실행되지 않을 수 있습니다. 이러한 시나리오를 처리하기위한 제한된 실행 영역에 대해 읽으십시오.
Mehrdad Afshari 2016 년

이 링크는 그것을 설명합니다 : return Statement and try ... catch ... finally Statement
amit jha

14

개인적으로, 나는 마지막 진술 전에 return 진술을보고 싶지 않다 때문에 이런 종류의 코딩을 피할 것입니다.

내 마음은 간단하고 오히려 선형으로 처리합니다. 따라서 드라이 런 코드를 살펴보면 일단 return 문에 도달하면이 모든 경우에 따르는 모든 것이 중요하지 않다고 생각하는 경향이 있습니다 (반환 문에 영향을 미치지는 않지만) 부작용이 무엇인지).

따라서 return 문이 finally 문 뒤에 항상 나타나도록 코드를 정렬합니다.


9

이것은 귀하의 질문에 대답 할 수 있습니다

시도에서 실제로 일어나는 일 {return x; } 마지막으로 {x = null; } 진술?

그 질문을 읽음으로써 예외가 발생할 수 있다고 생각되면 finally 문에 다른 시도 catch 구조를 가질 수있는 것처럼 들립니다. 컴파일러는 언제 값을 반환할지 알아낼 것입니다.

즉, 나중에 코드를 이해하지 못하는 사람이나 나중에 혼동하지 않도록 코드를 재구성하는 것이 좋습니다.


흠. 안전하다는 것을 의미하지만 피해야한다는 의미입니까?
lomaxx

3
개인적으로 코드의 가독성을 조금 어렵게 만들고 코드를 구성하는 다른 방법을 알아 내면 충분하다고 생각합니다. 그러나 실제로 그것은 단지 개인적인 취향입니다.
스펜서 루 포트

3
나는 당신의 개인적인 취향에 동의하는 경향이 있습니다 :)
lomaxx

나는 그것이 어디에서나 괜찮다고 생각합니다. 예외가 발생하지 않으면 메소드는 값을 리턴합니다. 최종 정리 코드에서 예외가 발생하더라도 중요하지 않습니다.
Lawrence Dol

마지막으로 리턴하는 것에 대한 제한 은 Java에 존재 하지 않습니다 (그러나 제한은 C #에 대한 kudos라고 생각합니다).
Lawrence Dol

5

기능적으로 차이는 없습니다.

그러나 이것을하지 않는 한 가지 이유가 있습니다. 종료 점이 여러 개인 더 긴 메소드는 종종 읽고 분석하기가 더 어렵습니다. 그러나 그 반대는 catch와 finally 블록보다 return 문과 더 관련이 있습니다.


또한 힘들어 높은 복잡성을 읽을 수 있다는 더 많은 중첩으로 끝낼 수 있기 때문에 나는이 도전 것
matt_lethargic

3

귀하의 예에서 어느 쪽이든 동등한 것은 컴파일러가 동일한 코드를 생성하면 놀라지 않을 것입니다. finally 블록에서 예외가 발생하면 return 문을 블록에 넣거나 바깥에 넣을 때 같은 문제가 발생합니다.

실제 질문은 문체 적으로 가장 좋습니다. 하나의 return 문만 있도록 메서드를 작성하는 것이 좋습니다.이 방법으로 메서드의 흐름을 쉽게 볼 수 있습니다. 따라서 return 문을 마지막에 놓아서 메소드의 끝과 이것이 리턴하는 것.

나는 return 문을 마지막 문장으로 깔끔하게 배치하면 다른 사람들은 여러 return 문을 메소드의 다른 부분에 뿌릴 가능성이 적습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.