2012-05-20 2 views
38

예외가 발생하면 실행할 코드가 있습니다. 그러나이 코드는 예외를 생성 할 수도 있습니다. 하지만 나는 사람들이 다른 try/catch 내부에서 try/catch를하는 것을 본 적이 없습니다.자바 - try/catch 내부에서 try/catch를하는 것은 나쁜 습관입니까?

내가 가난한 연습을하고있는 중이 야 무엇이며 어쩌면이 일을 더 나은 방법이있다 :

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    try 
    { 
     Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me       
    } 
} 

그것은 어색한의 종류를 보인다는. 거기에 뭔가 잘못되었을 수 있습니까?

+3

독자적인 방법으로 catch 블록에 코드를 삽입하는 것이 좋습니다. –

+0

@HunterMcMillen 좋은 지적. :) – GeekedOut

답변

32

예외 처리 논리가 복잡한 경우에도 자체 함수로 분리하는 것이 좋습니다.

9

이렇게 많은 중첩 수준을 가진 코드를 작성하는 것은 바람직하지 않습니다. 특히 try-catch에 - 그러니 피하십시오. 피하십시오. 반면에 catch 블록에서 예외를 던지면 용서받을 수없는 죄가되므로 매우 조심해야합니다.

내 조언 - (그래서 catch 블록은 간단하다)하는 방법으로 catch 논리를 추출하고이 방법은 아무것도 넣지 않습니다 있는지 확인하십시오 또한

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
    silentStartActivity(webintent) 
} 

//... 

private void silentStartActivity(Intent intent) { 
    try 
    { 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me      
    } 
} 

보인다 (내가 잘못 될 수도를) 당신을 예외를 사용하여 프로그램 흐름을 제어합니다. ActivityNotFoundException을 던지는 것이 예외적 인 경우가 아니라면 상황이지만 표준 상황에서 발생할 수있는 표준 반환 값을 고려하십시오.

+0

감사합니다 ... 당신은 try/catch에서 예외를 던지는 것이 죄라는 이유는 무엇입니까? :) – GeekedOut

+1

"너무 많은 수준?" 나는 3의 총계를 본다. 'catch' 블록의 로직은'try' 블록의'if' 블록보다 깊지 않습니다. –

+0

내가 깨뜨린 것을 보았을 때의 문제는 외부 URL로 이동하려고 시도하기 때문에 예외가 발생할지 여부를 확인하는 방법을 알지 못한다는 것입니다. – GeekedOut

3

답변 No..It들이, 또 다른 하나의 내부 처리 할 예외를 많이 가지고 있기 때문에 100 % 벌금 ... 당신은, JDBC 및 IO에서이 많이 사용해야 할 수도 있습니다입니다 ... 여기

0

boolean flag = false; 
void test(); 
if(flag) 
    { 
    test2(); 
    } 

시험 방법이 간다 :

private void test(){ 
    try { 
     Uri uri = Uri.parse("some url"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
     startActivity(intent); 
    }catch (ActivityNotFoundException anfe){ 
     System.out.println(anfe); 
     flag =true; 
    } 
} 

이제 넣어 당신은 또한 다음과 같이 그것을 할 수 있습니다 중첩 시도 및 캐치, 을 사용하지 않으려는 경우 대체 솔루션입니다 두 번째 방법의 나머지 코드 :

public void test2(){ 
    Uri weburi = Uri.parse("some url"); 
     try 
     { 
      Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
      startActivity(webintent); 
     } 
     catch (Exception e) 
     { 
      // Make some alert to me      
     } 
+0

자바 및 많은 다른 프로그래밍 언어에서 동일한 조건 논리를 여러 가지 방법으로 작성할 수 있습니다. 질문은 왜 첫 번째 try/catch의 catch 블록에 두 번째 try/catch를 쓰는 것보다 메서드가 더 좋고, 효과적이며, 최적이라고 생각하는 것입니다. – Bloodysock

관련 문제