2010-02-23 4 views
8

하나의 메서드에서 여러 try를 사용하고이 코드를 구조화하는 것은 나쁜 습관이라고 생각합니까?이런 종류의 자바 예외 스타일 나쁜 연습인가요?

public void whatever() { 
    try { 
    methodThatMayThrowIOException(); 
    } catch(IOException io) { 
    // do something with exception here 
    } 

    // do more stuff here that won't throw exceptions 

    try { 
    methodThatMayThrowCustomException(); 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 
+0

왜 나쁜 습관이되어야하나요? 주문한 것 같습니다 (나는 당신이 오직 당신이해야 할 곳을 잡는다). 내가 예외를 던지고 더 빨리 오류를 볼 것을 선호하기 때문에 (예외 계층 만 잡아라.) – helios

+3

자세한 내용을 모른 채 대답 할 수 없습니다. IOException이 복구 될 수 있다면 좋은 스타일이며, 그렇지 않으면 매우 나쁜 스타일입니다. –

+0

IOException은 단지 예일뿐입니다. 한 가지 방법으로 여러 번의 시도가 궁금합니다. – Geo

답변

3

파트 1을 원한다면 코드를 읽고 (필요한 경우 IOException을 잡아 내고 해결) 예외가없는 부분을 수행 한 다음 methodThatMayThrowCustomException을 수행하십시오. 코드는 문자 그대로 다른 방법으로 쓰거나 동일한 기능을 유지할 수 없습니다. 그것은 과장된 것입니다. 그러나 다른 모든 버전은 피상적 인 의미에서 다를 수 있습니다.

public void whatever { 
    try { 
    methodThatMayThrowIOException(); 
    // do more stuff here that won't throw exceptions 
    methodThatMayThrowCustomException(); 
    } catch(IOException io) { 
    // do something with io exception here 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 

하고 예외 중 하나가 발생하는 경우 실행하는 방법과는 매우 다르다 :

같은 하지입니다. 제 1 부에서 순차적으로 복구해야하는 경우 파트 2 을 입력하고을 입력 한 다음 파트 3을 수행하십시오. 다른 방법으로 코드를 작성할 수는 없습니다.

두 개의 catch 블록이있는 것은 아무 문제가 없습니다. 사용자 지정 예외를 throw하는 것으로 IOException을 발생시키는 무언가를 혼합해도 문제가 혼합되어 코드를 이해하기 어려울 수 있습니다. 그러나 그것이 그렇듯이, 그것은 단지 유효하지 않습니다. 그것은 당신이하는 일을하는 유일한 방법입니다.

+0

그는 어떤 경우에도 파트 2를 치고 싶다고 명시 적으로 말한 적이 없습니다. '// 여기에 io exception something with do here' 부분은'throw new WhateverException();'일 수 있습니다. 예를 들어, 여러 catch 블록이 잘 작동하고 훨씬 명확합니다. 그것이 내 대답에서 밝히고자하는 요점이다. 그가 실제로 더 많은 일을 할 수 있다는 사실을 실제로 활용한다면 그의 접근 방식을 사용하라. 그렇지 않으면 다중 catch 블록의 "약한"표준 규칙을 사용하십시오. – polygenelubricants

+1

@ polygenelubricants, 찍은 점, 고마워. –

3

확인을 보이지만 전체 whatever 방법을 실패 methodThatMayThrowIOExceptionmethodThatMayThrowCustomException이하는 일에 첫 번째 일 (methodThatMayThrowIOException)의 고장 여부 따라 달라집니다.

2

실제로 예외 상황과 관련하여 유용한 정보를 제공하는 한 그 이유는 안좋은 실례입니다.

7

지정된 예외가 발생하더라도 아무런 문제없이 메서드를 계속 실행할 수 있으면 좋습니다.

예외가 메서드에서 줄 아래쪽으로 문제를 일으키는 경우에는 거품이 생길 수 있습니다.

5

아니요. 이럴 그것은 이것보다 확실히 나은, 그들이 던져 질 수있는 경우에 특정 예외를 잡을 수있는 좋은 지점입니다 :

public void whatever { 
    try { 
     methodThatMayThrowIOException(); 
     // do more stuff here that won't throw exceptions 
     methodThatMayThrowCustomException(); 
    } catch(ParentException e) { 
     // do something with custom exception here 
    } 
} 
+0

methodThatMayThrowCustomException()이 처리 된 예외를 Throw 한 후에 완벽하게 정상적으로 작동하면 어떻게 더 나 빠질까요? –

+0

게다가이 예제에서는 IOException과 CustomException이 공통 부모를 가졌다 고 확신하지는 않는다 (Exception을 제외하고 Exception은 좋은 생각이 아니다). –

+0

@Thomas Lötzer : 무엇? 'methodThatMayThrowIOException()'가 예외를 던지면'methodThatMayThrowCustomException()'는 전혀 실행되지 않을 것입니다 ... 만약 당신이 메소드 내부에서 try catch에 대해 이야기하고 있다면 여러분은 가정을하고 있습니다. 나는 생각한다. @Valentin Rocher : 일반적인 부모를 잡아 내지 못한다면 (예외 만있는 경우 라 할지라도) 정확하게 대답입니다. –

0

잘 당신이 달성 하려는지에 따라 달라집니다. 예외가 발생하면 코드 블록을 블록으로 실행해야하거나 전혀 실행하지 않으면 보통 단일 try-catch 블록에 코드 블록을 묶습니다. 그렇지 않은 경우 다른 예외를 다른 try-catch 블록에 던져 다른 코드 블록을 분리하는 것이 "예외를 발생시키지 않는 더 많은 작업을 수행"하는 것이 훨씬 더 효과적이라고 생각합니다. 그냥 생각!

3

IOException이 발생하면 수행 할 계획에 따라 달라집니다. 당신의 스타일은 더 많은 일을 할 수있게 해줍니다. 그러나 실제로 그것을 활용할 계획이 아니라면, 표준 관용법을 사용하면 훨씬 더 명확하게됩니다.

public void whatever { 
    try { 
    methodThatMayThrowIOException(); 
    // do more stuff here that won't throw exceptions 
    methodThatMayThrowCustomException(); 
    } catch(IOException io) { 
    // do something with io exception here 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 

여기서 IOException이 발생하면 catch 블록 안에있는 것만 수행하고 다른 것들은 수행하지 않는다는 것을 쉽게 알 수 있습니다.

+0

그는 두 번째와 세 번째 섹션을 가지고 있기 때문에 이미 그것을 이용하고있다. –

+0

예.하지만 첫 번째 catch 블록이/throw를 반환하거나 두 번째 섹션과 세 번째 섹션의 실제 고기와 감자가 실행되지 않도록 보호 플래그를 설정할 수 있습니다. – polygenelubricants

+1

True입니다. 나는 그가 "내 코드가 내가 원하는 것을 정확하게 수행하는지 묻고 있다고 생각했다."이것은 나쁜 생각입니까? 하지만 당신 말이 맞아. 그가 원하는 것을 정확하게하지 못할 수도 있습니다. +1 –

1

AFAICS에는 문제가 없습니다. 그러나, 메서드에서 2 try-catch 내 눈을 찔러. 만약 당신이 똑같다고 느끼면, 나는 당신을 적절한 방법으로 리팩터링 할 것을 제안합니다.

1

아니요. 어떤 종류의 예외가 발생하는 범위를 좁히는 것이 좋습니다. 나는 이것을 내 코드에서 많이했다.

그러나 하나의 try ... catch 블록에서 특정 종류의 예외가 고유 한 함수에 의해서만 throw되고 해당 블록을 동일한 try 블록에 두는 것이 좋습니다.

0

개인적으로 나는 혼란스러워 보입니다. 나는 필요한만큼 많은 블록을 잡아 내고 하나의 시도 만하는 것을 선호합니다. 나는 하나의 방법으로 여러 개의 try/catch 시퀀스를 신경 쓰지 않는다.

관련 문제