2012-05-03 2 views
18

예외가 throw되지 않는 경우에만 블록을 실행하는 방법이 있습니까?finally catch 시도 : 예외가 throw되지 않는 경우 무언가 수행

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

더 나은 방법이 있나요 :

내가 가지고 올 수있는 최선이 무엇입니까?

+0

try 블록 내에 "return"이 있습니까? – Guillaume

+0

답변에 그들 사이에 18 표가 있고 질문 1 표가 있습니까? –

+0

@Guillaume no returns – lowerkey

답변

33

물론 있습니다 : try 블록의 하단에 넣으십시오.

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

이 "당신이 원하는"가 발생하는 경우, 예외가 로컬 잡힐 것이라는 의미에서 원래 코드 (이 원래 계획에 일어나지 않을 것이다)에 완전히 동일하지 않습니다. 이것은 당신이 관심을 가질 수도 있고 그렇지 않을 수도있는 것입니다. 그리고 다른 행동이 또한 올바른 기회 일 것입니다.

다시 이전 동작을 가지고 싶다면, 당신은 또한 단지 "만약 예외없이"조건 작성을 위해 대한 finally을 필요로하지 않습니다이 변형 사용할 수 있습니다

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, 좋은 대답. –

+0

이 패턴을 반복하면 try-catch imbrication이 발생한다는 문제점이 있습니다. 따라서 예상되는 예외가 거의없는 경우에만 권장됩니다. –

+0

@dystroy : 무슨 뜻인지 모르겠다면, 자세히 설명해 주시겠습니까? – Jon

3

당신이 돈을 finally 절이 필요하지 않습니다.

해결책 : 당신도 테스트를하지 않아도 보통

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

당신은 단순히 당신의 캐치 절에 반환해야합니다 :

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

또는 (용도에 따라 일반적으로 덜 명확합니다. 특히 하나 이상의 예외가 예상되는 경우 특히 시도 잡기 기능을 원하지는 않습니다.) :

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

아뇨 - C#으로 할 수있는 최선의 방법 일 것입니다.

은 가정된다

  • 당신은 "내가 여기에 원하는 것을 할 수있다" 코드가 try 블록의 하단에 실행하지 않습니다. (아마 당신은 그 코드에서 예외가 주요 catch 블록에 의해 처리 될 싶지 않기 때문에.)
  • 당신은 완전히 외부 try...catch...finally의 실행 코드를 "내가 여기서하고 싶은 것을 할 수있다"싶지 않아 구조. (당신이 원하기 때문에 아마도 그 코드는 finally 블록 안에 앉아있어 다른 코드 앞에 실행합니다.)
4

당신은 doSomething이 블록의 마지막 문입니다 코드를 구성 할 수 있으며 throw하지 않습니다?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosterno가 마침내 여기 블록해야합니다. –

+1

나는 항상 실행하고 싶었던 상용구 정리 코드가 있다고 가정했습니다. 그렇지 않다면, 당신은 분명히 옳습니다. –

2

Yes (예)가 : 는 try 블록 :

1

의 마지막에 넣어 코드 아무 문제가 없지만, 불필요한입니다.

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

나는 당신이 당신의 시도 내 시도를 찾고 있습니다 생각 : 단순히 try 블록의 하단에 당신이 실행하고자하는 코드를 넣어이 비록

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

은 일반적으로 나쁜 관행으로 간주됩니다, 나는 깃발 버전보다 더 좋아합니다.

관련 문제