2013-08-31 5 views
1

제어 흐름에 대한 예외를 사용하는 것이 좋지 않다고 읽었지만 예외를 throw하지 않고 어떻게 쉽게 다음을 달성 할 수 있습니까? 따라서 사용자가 이미 사용중인 사용자 이름을 입력하면 입력 필드 옆에 오류 메시지를 표시하려고합니다. 내 userService의 저장 방법제어 흐름에 대한 예외 사용

public String signUp() { 
    User user = new User(username, password, email); 

    try { 
     if (userService.save(user) != null) { 
      // ok 
     } 
     else { 
      // not ok 
     } 
    } 
    catch (UsernameInUseException e) { 
     // notify user that username is already in use 
    } 
    catch (EmailInUseException e) { 
     // notify user that email is already in use 
    } 
    catch (DataAccessException e) { 
     // notify user about db error 
    } 

    return "index"; 
} 

: 예외를 사용

@Override 
@Transactional 
public User save(User user) { 
    if (userRepository.findByUsername(user.getUsername()) != null) { 
     LOGGER.debug("Username '{}' is already in use", user.getUsername()); 
     throw new UsernameInUseException(); 
    } 
    else if (userRepository.findByEmail(user.getEmail()) != null) { 
     LOGGER.debug("Email '{}' is already in use", user.getEmail()); 
     throw new EmailInUseException(); 
    } 

    user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt())); 
    user.setRegisteredOn(DateTime.now(DateTimeZone.UTC)); 

    return userRepository.save(user); 
} 
+1

프레임 워크를 사용하고 있습니까? 아니면 그냥 평범한 Servlet-JSP 기반 웹 응용 프로그램입니까? –

+0

JSF 2.2, Spring 3.2 및 Hibernate 4.2를 사용하고 있습니다. – perak

답변

0

당신이 다른 어떤 작품처럼 여기 내 가입 페이지 백업 빈의 코드입니다. 그것을 사용할 수는 있지만 과용하지는 마십시오.

일반적으로 올바르지 않은 일이 발생했지만 프로그램이 다른 모듈에서 복구 될 수있는 경우 예외를 throw하려고합니다. 예외는 프로그램을 (더 정확하게 런타임 스택을) 양호한 상태로 만드는 데 도움이되므로 오류에 대해 뭔가 할 수 있습니다.

일반적으로 반환 값을 사용하는 것은 좋은 생각이 아니며 종종 좋지 않은 디자인으로 간주됩니다.

예외가 발생하면 사용자에게 UI에 발생하는 메시지가 표시되고 가입 ​​로직 자체와 별개로 예외가 발생하므로 예외가 적절하게 사용됩니다.

이제 과용 할 부분입니다. SignupException과 같은 단일 예외를 쉽게 처리 할 수 ​​있습니다.이 예외는 왜 잘못되었는지 설명합니다. 당신은 아마 생산적인 코드를 가진 클래스보다 더 많은 예외 클래스를 가진 시스템으로 끝내고 싶지 않을 것이다.