2014-11-12 2 views
2
try 
{ 
    operation1(); 
    operation2(); 
    ... 
} 
finally 
{ 
    try 
    { 
     finalizer_operation1(); 
     finalizer_operation2(); 

    } 
    finally 
    { 
     very_critical_finalizer_operation_which_should_occurs_at_the_end(); 
    } 
} 

괜찮습니까? finalizer_operationX() 던질 수 있고, 내가 very_critical...() 의지가 마지막에 발생하는지 확인해야하기 때문에 (다른 try/finally 블록으로 파이널을합니다.finally 블록을 시도하십시오.

마지막으로을 차단에서 시도 에 대한

빠른 인터넷 검색 당신이 나에게 중복 된 링크를 제공하는 경우 질문을 삭제합니다 (아무것도 제공하지), 그것은 해야 작동하지만 I가 디자인 가능한 문제가 확실치. 그것이 물론

+3

그냥 당신은 내가 어떤 문제가 표시되지 캐치 섹션 – yonutix

+0

에서 return 문을 경우에도, 절은 항상 실행 마무리 것을 명심 확인해야합니다. 예를 들어,'finally' 블록에서 어떤 메소드를 호출하면, 그 블록은'try-finally' 블록을 포함합니다 - 특별한 것은 없습니다. 귀하의 경우에는 동일한 방법으로 발생합니다. –

+0

@CosminMihai, 여기에는 'catch 섹션'이 없습니다.) – Sinatr

답변

9

나는이 방법으로 코드를 작성하지 않을 것이다. 나는 중첩 try/catch/finally 구조를 좋아하지 않는다. 나는 방법마다 하나씩 선호한다.

내가 선호하는 것은 각 호출을 고유 한 방법으로 래핑하는 것입니다.

try 
{ 
    operation1(); 
    operation2(); 
    ... 
} 
finally 
{ 
    cleanup(); 
} 

public void cleanup() { 
    try 
    { 
     finalizer_operation1(); 
     finalizer_operation2(); 

    } 
    finally 
    { 
     very_critical_finalizer_operation_which_should_occurs_at_the_end(); 
    } 
} 
+0

필자는 그렇게 하겠지만, 제 경우에는 연산과 finalizer_operations가 동일한 로컬 변수 (첫 번째'try'에서 정의 됨)를 사용하고 있습니다. 그래서 코드를 새로운 메소드로 옮기는 것이 문제가됩니다. – Sinatr

+4

@Sinatr 거기에 '메서드 매개 변수'에 대한이 애매한 개념이 있습니다. – decPL

+0

동일한 점을 가지고 있기 때문에 내 대답을 삭제했습니다. +1 –

1

. 제어 흐름은 대응 try 블록 들어가면 실행할 finally 블록.

유일한 예외는 VM을 종료하는 호출입니다.

+2

"JVM"을 의미하지 않았을 것 같습니다. – dcastro

+0

여기에 JVM이 없습니다. VM : – HimBromBeere

+0

공동으로 게시 할 예정입니다! – Bathsheba

관련 문제