Pergunta

Eu procurei por isso por um longo tempo (também aqui), tenho lido muitos códigos de php, mas ainda não conseguiu encontrar uma resposta satisfatória. Pode parecer um muito grande tema, mas realmente paus juntos - finalmente para mim. Você poderia por favor me ajude?

Em um site php Eu tenho DOP como DAL, que é usado por BLL objetos, e eles são chamados a partir da interface do usuário. Agora, se algo acontece, DOP lança uma PDOException. Claro que a camada de interface do usuário não precisa saber nada sobre PDOExceptions, portanto, o objeto capturas BLL-lo. Mas e agora?

Eu li que

  1. exceções são para situações verdadeiramente excepcionais e
  2. um re-lança exceções de camadas mais baixas a fim de não obter exceções de baixo nível nas camadas superiores.

Deixe-me ilustrar o meu problema (por favor, não prestar atenção aos argumentos de função):

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
}

Esta é a solução certa? Quando re-lançar a PDOException Eu não acho que seria apropriado para uso exceção encadeamento (pois isso só faria depuração redundante informação; DataAccessException recebe tudo, incluindo o rastreamento de pilha cheia de PDOException).

Agradecemos antecipadamente.

Foi útil?

Solução

Como eu entendi o seu post um recurso boa é esta: Api projeto

Eu acho que você fez sua lição de casa (se posso usar a expressão), mas você esqueceu a razão por que esta coisa está sendo feito. No seu exemplo eu criar algo como

SignUpException

que iria informar as camadas superiores que algo tem de errado ido cerca de inscrição. O que você faz aqui é, essencialmente, mascarando uma exceção de banco de dados com um diferente nomeado um, que é essencialmente a mesma coisa, algo que, embora programaticamente correta, perde o ponto do por -s de fazê-lo no primeiro lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top