2009-11-27 2 views
0

오랫동안 여기를 검색하여 많은 PHP 코드를 읽었지만 여전히 만족스러운 답변을 찾을 수 없었습니다. 너무 많은 주제로 보일지 모르지만, 결국은 함께 스틱을.습니다. 도와 주실 수 있겠습니까?레이어를 통한 예외 재발생 및 상태 코드 사용

PHP 웹 사이트에서 DAL로 PDO가 있고 BLL 개체에서 사용하는 것은 UI에서 호출됩니다. 이제 인 경우이 발생하면 PDO가 PDOException을 발생시킵니다. 물론 UI 레이어는 PDOExceptions에 대해 알 필요가 없으므로 BLL 객체가 PDOException을 catch합니다. 하지만 지금은 뭐야?

나는

  1. 예외가 정말 예외적 인 상황이며,
  2. 하나는 상위 계층에서 낮은 수준의 예외가 발생하지 않도록 하위 계층에서 예외를 다시 throw합니다 읽었습니다.

(함수 인수에 관심을 지불하지 마십시오) 내 문제를 설명하자

class User 
{ 
function signUp() 
{ 
    try 
    { 
    //executes a PDO query 
    //returns a code/flag/string hinting the status of the sign up: 
    //success, username taken, etc. 
    } 
    catch (PDOException $e) 
    { 
    //take the appropriate measure, e.g. a rollback 

    //DataAccessException gets all the information (e.g. message, stack 
    //trace) of PDOException, and maybe adds some other information too 
    //if not, it is like a "conversion" from PDOException to DAE 
    throw new DataAccessException(); 
    } 
} 
} 

//and in an upper layer 
$user = new User(); 
try 
{ 
$status = $user->signUp(); 
//display a message regarding the outcome of the operation 
//if it was technically successful 
} 
catch (DataAccessException $e) 
{ 
//a technical problem occurred 
//log it, and display a friendly error message 
//no other exception is thrown 
} 

이것은 적합한 솔루션인가? PDOException을 다시 throw 할 때 예외 체인을 사용하는 것이 적절하지 않다고 생각합니다 (디버깅 정보가 중복되므로 DataAccessException은 PDOException의 전체 스택 추적을 포함하여 모든 것을 가져옵니다).

미리 감사드립니다. 내가 좋은 자원이이 게시물을 알 수있는 바와 같이

+0

저에게 완벽하게 보입니다. 당신이 그것을 확신하는 한; 보다 일반적인 DAE 예외로 PDO 예외를 다시 throw하면 전환시 디버그 정보가 손실되지 않습니다. 이상적으로는 기본 Exception 클래스에 지정된 세 번째 매개 변수로 전달해야하므로 전달됩니다. – Atli

+0

답장을 보내 주셔서 감사합니다! 예외 연결 (PDOE를 세 번째 매개 변수로 전달)을 고려했지만,이 경우에는 (php.net 예제와는 반대로) 실제로 요점을 보지 못합니다. 모든 유용한 디버깅 정보가있는 PDOE가있을 것입니다. 동일한 데이터를 가지고 있지만 위의 계층에서 오는 또 다른 예외가 있습니다. – Piedone

답변

0

: Api design

나는 (I 문구를 사용할 수있는 경우) 당신이 당신의 숙제를 한 적이 있지만,이 일이 완료되는 이유를 잊고 있다고 생각합니다. 귀하의 예제에서 나는 무언가가 가입에 대해 잘못되었다는 것을 상위 레이어에 알려주는

SignUpException 

과 같은 것을 만들 것입니다. 여기에서하는 일은 본질적으로 똑같은 다른 이름의 데이터베이스 예외를 기본적으로 마스킹하는 것입니다. 프로그래밍 방식으로 올바르지 만 -s 첫 번째 지점에서 오류가 발생합니다.

+0

답변 해 주셔서 감사합니다. 나는 거의 숙제로 끝내기 때문에 다행이다 .--). 너는 완전히 옳다. 나는 그 요점을 놓쳤다. 나는 비디오를 볼거야, 아주 흥미로운 것 같아. – Piedone