2009-09-17 5 views
4

현재 내 PHP MVC 웹 응용 프로그램이 클라이언트 코드를 가지고 :다른 이름으로 예외를 다시 처리 하시겠습니까? 표준 관행은 무엇입니까?

try { 
    BookMapper::insert($book); 
} catch (DbUniqueConstraintViolationException $e) { 
    $errorList->addMessage($book . " already exists!"); 
} 

내가 궁금하네요 낮은 수준의 프레임 워크 DB를 참조하는 것이 나쁜 방법입니다 * 내 클라이언트 코드에 대한 예외? 그렇다면, 정말처럼 내 모델 코드를 조정해야합니다 :

class BookAlreadyExistsException extends Exception { } 

class BookMapper { 
    public static function insert($book) { 
    try { 
     // call to DB-layer to insert $book 
     // (not relevant to the question) 
    } catch (DbUniqueConstraintViolationException $e) { 
     throw new BookAlreadyExistsException(); 
    } 
    } 
} 

다음이 새로운 클라이언트 코드를 사용 ... 다른

try { 
    BookMapper::insert($book); 
} catch (BookAlreadyExistsException $e) { 
    $errorList->addMessage($book . " already exists!"); 
} 

또는 무언가? 아니면 원래의 방법은 괜찮습니까?

감사합니다.

EDIT : 후자의 메서드는 가장 좋은 IMO를 읽지 만 개체 생성/재배치 오버 헤드가 있으며 더 중요한 것은 모든 매퍼의 insert() 메서드에서 재실행 코드를 복제해야한다는 것입니다. 이전 방법은 구현하기 쉽고 모든 모델에서 작동하고 작동하지만 어딘가에서이 방법으로는 안된다는 것을 기억합니다.

답변

2

나는 당신이 틀림없이 당신 자신의 예외를 던져야한다고 생각한다.

하지만 세 번째 옵션을 고려해 볼 때 성공할 경우 insert 메서드가 true를 반환하고 실패 할 경우 false를 반환합니다. 예외는 예외에 사용되어야하며 책이 이미 존재한다는 사실은 실제로 예상/예측 가능한 사례 일 수 있습니다.

중복 된 서적이 프로그래밍 오류가 아닌 한 가능하지 않아야 할 진정한 이익이라면 데이터베이스 예외를 지킬 수는 있지만 그럴 경우 잡을 수 없습니다. 그것을 버블 링 시켜라.

+1

돌아 오는 참/거짓 사실. 다른 클라이언트 코드에서 더 많이 알 필요가 있다면? 예를 들어, 어떤 제약 조건이 위반되었습니다. 예외가 있으면 예외 오브젝트에서이 정보를 사용할 수 있습니다. 진실/거짓으로 나는 그것을 어떻게 얻을 것인가? "getLastSqlStateError()"또는 뭔가를 DB 레이어에 추가 할 것을 권합니다. –

+0

+1 추천하는 경우 예외 대신 true/false를 반환합니다. –

+0

누구든지 내 첫 번째 의견에 대해 조언을 제공 할 수 있습니까? –

1

매우 좋습니다 this article. 자바 용이지만, 원칙은 PHP에도 잘 적용된다. 잡기를 던져야하는 예외 유형에 대한 좋은 지침이 있습니다.

+0

고마워요. 내 게시물에서 내가 이야기하고있는 기사입니다. 예외적 인 경우에만 예외를 throw하는 부분을 건너 뛴 것으로 보입니다! –

관련 문제