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

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

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

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

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



답변

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


답변

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


답변

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

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

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


답변

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

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

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

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


답변

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

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


답변

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

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

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


답변