2012-08-28 5 views
2

finally 블록에 예외를 던지는 예기치 않은 결과 중 일부를 논의하는 것이 좋은 질문입니다. Catch block is not being evaluated when exceptions are thrown from finallys마침내 블록에 예외를 던지는 것이 좋은 습관입니까?

finally 블록에서 예외를 throw하려는 이유가 무엇인지 생각할 수 없습니다. 이전 예외가있는 경우 항상 손실됩니다. 난 항상 예외를 던져서는 안되는 방식으로 마침내 청소하는 것을 보았습니다.

finally 블록에서 예외를 throw하는 것이 적절한시기는 누구에게 설명 할 수 있습니까?

+0

내부에 던져진 예외는 호출자 위치의 각 catch 블록에 의해 catch됩니다. 그러나 페루가 말했듯이, 주어진 것이 더 안전하고 청결 해지면 왜 어지럽히는 것을 생각해야할까요? 마지막으로 엉망진창을 정리하지 않고 더 많은 것을 만들 수 있습니다. – Zenwalker

+1

당신이 언급 한 스레드는 클린업 코드에 의해 예외가 던져지는 시점부터 시작합니다 ... 개발자의 기대와는 반대로 'throw'를 사용하는 것이 아니라 .... ' 마침내 블록에서 예외를 던져 * '전혀? 나는 그것이 아닌 것 같아요 ... – horgh

+0

원래 게시물에서 http://stackoverflow.com/questions/12150994/catch-block-is-not-being-evaluated-when-exceptions-are-thrown-from-finallys I finally 블록에서 가능한 예외를 피하기 위해 finally 블록의 내용을 try..catch로 감싸는 답을주었습니다. 그리고 나는 여전히 생각합니다. finally 블록이 예외를 던질 수 있습니다. – horgh

답변

1

try catch는 결국 매우 중요한 구성입니다. 예외가 발생하더라도 finally 블록의 코드가 실행된다는 것을 확신 할 수 있습니다. 외부 리소스를 처리하는 것은 매우 중요합니다. 가비지 콜렉션은 그렇게하지 않을 것입니다. 마지막 부분에서는 return 문이나 예외를 throw해서는 안됩니다. 그것은 가능하지만 나쁜 실행이며 예기치 않은 결과를 초래할 수 있습니다.

+1

네,하지만 이건 마지막으로 예외를 던지는 것에 대한 질문입니다. –

1

Exception이 마지막에 던져지면 Exception이 던져진 지점에서 가장 중요한 정지 점이 전파되므로 결국 나머지는 실행되지 않습니다. 또한 try 블록에서 예외가 발생하면 현재 블록이 finally 블록에서 throw 될 것이므로 try 블록에서 예외가 발생하면 사라집니다.

마지막으로 Exception을 던진 다음 호출자 수준에서 특정 이유로 처리합니다 (이러한 논리를 관리하는 다른 방법이있을 수 있음). 따라서 시나리오를 생각할 수 없습니다. Exception에 기반하여 발신자 레벨 프로세스에서 추가로 처리 할 수 ​​있습니다.

내가 말할 수있는 것은 나중에 코드를 읽고 따라 다니는 모든 눈이 건강한 놀라움을 갖게된다는 것입니다.

1

.NET에서 잘 지원됩니다. 문제는 을 잡기 예외입니다. 매우 불량합니다. 프로그램 상태를 올바르게 복원 할 확률은 매우 낮습니다.

+0

마침내 예외를 던지면 마침내 예외가 발생하지 않는다고 말하는 겁니까? 나는 그 추론을 따르지 않는다. 항상 응용 프로그램이 종료되지 않습니까? –

+0

물론. 어느 것이 당신이 원하는지입니다. 예외를 throw 한 코드가 실행되기 전에 프로그램의 상태를 다시 복원 할 수없는 경우 예외를 처리 할 수 ​​없습니다. 예외가 항상 잡혀 야한다고 가정하지 마십시오. –

관련 문제