2012-05-30 3 views
0

시나리오 :모두 RuntimeException/Uncheck 예외 옹호,이 시나리오를 어떻게 처리하겠습니까?

사용자 ID를 기반으로 등록해야하는 웹 사이트의 경우 사용자 ID가 고유해야합니다. 사용자가 이미 존재하는 'foo'사용자 ID로 등록하려고했습니다 (다른 필수 필드와 함께). 이제 체크 예외를 사용하지 않고 (데이터베이스 API는 중복 삽입을 위해 SQLException을 던집니다), 체크되지 않은 예외를 어떻게 대처하여이 상황을 처리하고 사용자가 친숙한 ID를 이미 선택했는지 궁금합니다.

이 웹 사이트가 Struts에 있다고 가정 해 봅시다 (아니요, 프로젝트에서 일하지 않고 있으며, 더 잘 이해하고 있습니다). 사용자는 Struts 액션에 채워진 정보를 제출하여 DAO를 호출하여 새 레코드를 삽입합니다. 그래서 궁극적으로, DAO는 실패 할 INSERT 문을 발행 할 것이다. 따라서 Action (DAO 호출)이 명시 적으로이 상황을 처리하지 않으면 (DAO 메서드는 SQLException을 throw한다고 선언하거나 메서드가 SQLException을 catch하고 Exception을 확장하는 DuplicateUserIDExceptoion과 같은 비즈니스 검사 예외를 throw 할 수 있습니다. 확인되지 않은 예외?

결론 - 자바가 체크 예외를 필요로하지 않는다는 많은 기사를 읽었으므로,이 시나리오는 더 잘 이해할 수 있도록 도와 줄 것입니다. 제가 많은 책을 읽었을 때 기사를 가리 키지 마십시오. 정말 혼란 스럽습니다. 당신이 나를 도울 수있는 가장 좋은 방법은 위의 시나리오에 대한 답을 제공하는 것입니다.

참고 : 복구 가능한 예외 시나리오는 체크 된 예외 (프로젝트에서 구현하고있는 예외)로 처리해야한다는 것을 이해합니다. 그러나 확인되지 않은 예외만으로는 정말 혼란 스럽습니다. 위의 시나리오를 어떻게 처리합니까? 사전에

감사합니다.

답변

0

트랜잭션을 시작하고 데이터베이스에 쿼리하여 ID가 ​​존재하는지 확인하고 그렇지 않은 경우 삽입을 수행 한 다음 트랜잭션을 커밋하는 방법은 어떻습니까? 존재하는 경우 사용자에게 ID가 이미 있음을 알리십시오. 더 좋게는 양식의 사용자 이름 필드가 아약스 요청으로 흐려지는 지 검사하고 이미 찍혔다는 것을 나타낼 수 있습니다. ID가 존재하는지 여부를 결정하기 위해 데이터베이스 예외에 의존하려는 이유는 무엇입니까?

+0

JB Nizet이 대답하는 내 의견을 참조하십시오 ... – user1418717

4

확인되지 않은 예외는 확인 된 예외와 정확히 일치 할 수 있습니다. 이러한 경우를 처리하려면 다음을 사용하십시오.

  1. 사용자 ID가 이미 존재하는지 확인하십시오. 그렇다면 체크 된 DuplicateUserIdException을 던집니다. 확인 된 예외가 여기에 더 적합하다고 생각합니다. 하지만 예외를 런타임으로 만들 수도 있고 확인 된 예외를 catch 할 때 프리젠 테이션 계층에서 catch 할 수도 있습니다.
  2. 사용자를 삽입하십시오. SQLException이 발생하면, 그것이 이미 존재하는 사용자 ID에 의한 것인지 확실하지 않다. 또한 지연되면 커밋 시간에 제약 조건을 확인할 수 있습니다. 이 예외는 두 스레드 사이의 경쟁 조건에서만 발생하므로 거의 발생하지 않아야합니다. 그래서 기술 런타임 예외처럼 그것을 취급하고 일반적인 오류 메시지를 표시합니다.
+0

대부분의 DB 추상화 프레임 워크는 공급 업체별 오류를 유형화 된 예외로 변환하므로 쿼리를 건너 뛸 수 있습니다. –

+0

그리고 제약 조건이 연기되면 어떻게 될까요? 8 개의 테이블에 100 줄을 삽입하는 과정이 있다면 어떻게 될까요? 어떤 삽입으로 인해 ConstraintViolationException이 발생하고 어떤 제약 조건을 위반했는지 어떻게 알 수 있습니까? –

+0

프로세스를 두 개의 트랜잭션으로 분리하십시오. 하나는 요청한 ID로 사용자를 작성하는 최소한의 작업을 수행하고 다른 하나는 관련 정보를 빌드하는 트랜잭션입니다. –