2012-03-26 3 views
2

클래스는 만드는 방법이 있나요이 하나PDO 자식 개체 대신 PDOException 대신 CustomException을 throw하는 방법이 있습니까?

class DB extends PDO {} 

(기록을 위해 하나의 방법 (생성자) 우리는 생성자에 매개 변수를 전달하지 않으며 우리가 연결할 수 있도록 부모를 과부하이있는 $e

throw new CustomException($e->getMessage(), 500, array($e->...)); 

PDOException occurre의 인스턴스 인 :

) 구성 파일을 통해하면이 같은 어떤 경우에 사용자 정의 CustomException를 던질 수 d, try-catch 블록 내의 모든 메소드를 래핑하지 않고 기본값 PDOException 대신에?

+0

이 이유는 무엇입니까? – Niko

+0

@ Niko, 길고 예쁜 지루한 이야기. 내 응용 프로그램이 던질 모든 예외를 포함해야합니다 중앙화 된 CustomException 있어야합니다. 그냥 나를 믿어. PDOException을 사용하기 전에 CustomException으로 변환해야합니다. 그 후에는 할 수 없습니다. 그리고 아닙니다, PDO의 오류 모드를 일반적인 PHP 오류로 설정하고 정상적인 경고로 잡을 수 없습니다. – Shoe

+0

어떤 시점에서 모든 예외를 잡아야하는 경우에는'catch (Exception $ e)'만 사용하는 것이 좋습니다. 그건 PDOExceptions뿐만 아니라 CustomExceptions를 잡는다. – Niko

답변

3

코드가 (유형 오리 타이핑 대 힌트)이어야 형태 보증 된 방법 확실하지 :

당신은 하지가 PDO를 확장하고 __call 마법의 방법을 통해 대리인으로 사용 않는 클래스를 작성할 수 있습니다. __call() 내부에서 실제 PDO 예외를 catch하고 사용자 정의 예외에서 감쌀 수 있습니다. 그래서 당신은 여전히 ​​래퍼를 작성해야하지만 다소 짧은 것을 작성해야합니다.

+0

PDOStatement는 어떻게 관리해야합니까? 우리는 그 메소드들도 커버해야합니다 ... – Shoe

+0

prepare()를 덮어 쓰고 하나의 __call() 래퍼로 하나 이상의 delegate 객체를 반환 할 수 있습니다. 상위 계층의 어떤 시점에서 단순히 PDOException을 catch하고 CustomException으로 감싸거나 다시 던지기를 고려 했습니까? – tweber

+0

예,했는데 옵션이 아닙니다.PDOStatement의 확장을 설정할 수는 있지만 PDOStatement의 자식이어야하므로 __call()이 작동하지 않습니다. 나는 다른 것을 관리 할 것이다. 생각이 당신의 마음에 온다면 알려주십시오 :) – Shoe

1

독자적인 방법으로 사용자 정의 예외를 throw 할 수 있습니다. 당신이 이상 확장 된 클래스의 각 PDO 방법을 쓰고, 만든다면 그는 다음과 같습니다 :

public function query($statement) { 
    try { 
     parent::query($statement); 
    } catch (PDOException $exception) { 
     throw new CustomException(whatever you want to do here); 
    } 
} 

PDO는 PDO 예외를 throw 할 때마다이 방법은 예외를 잡아서 자신의 사용자 지정 예외가 발생합니다. 그러나 PDO가 PDOStatement와 같은 다른 클래스를 사용한다는 점을 명심해야합니다. PDOStatement는 자신 만의 PDOExceptions를 만들 수 있습니다.이 PDOExceptions는 또한 덮어 쓸 수도 있습니다. PDO의 메소드 인수를 통해 명령문 클래스로 사용할 수 있습니다.

+0

나는 또한 예외의 던지기를 자체 메서드에서 랩하고 나중에 쉽게 편집 할 수 있도록 호출합니다. – dqhendricks

+0

-1 "try-catch 블록 내의 모든 메소드를 래핑하지 않고"질문을 철저히 읽지 않으므로 -1입니다. * – FtDRbwLXw6

+0

@drrcknlsn 그는 클래스의 인스턴스를 사용할 때 각 메소드 호출을 래핑하지 않아도된다는 의미 일 수 있습니다. 클래스 메서드 내에서 try catch 블록을 넣기 위해 각 메서드를 덮어 쓸 수있는 옵션을 알고 있습니다 ... – dqhendricks

관련 문제