Controle de Erros em PHP

Artigo que apresenta como funciona o controle de erros do PHP.

Tratamento de erros é a estratégia usada para capturar a ocorrência de uma situação que impede o sucesso de uma operação do sistema. Isso pode se dar em diferentes níveis. Em baixo nível: uma função pode receber um parâmetro inesperado. Em alto nível, uma ferramenta pode não aceitar determinada sequência de ações do usuário.

Penso que seja fundamental distinguir o que é um erro de baixo nível de um erro de alto nível. Cada um destes erros pode tomar um rumo diferente e ser informado ao usuário de maneira diferente também. Se, por algum motivo, o programador gerou uma SQL errada e isso impediu que um valor fosse salvo no BD, não é conveniente informar ao usuário que o problema foi na SQL, afinal, o usuário final não precisa (e nem deve) saber o que é SQL. Entretanto, se o usuário preencheu o campo de um formulário com um valor inválido, ele deve ser informado com detalhes sobre o que ele errou e/ou como pode corrigir.

Utilizar exceções (exception) nativas da linguagem PHP é uma solução especialmente indicada para tratar dos erros de baixo nível. No caso de erros de alto nível, também pode ser utilizada a mesma alternativa, embora eu prefira utilizar métodos de validação da entrada dos dados do usuário e armazenar as mensagens de erros em um array (por exemplo). Note que, normalmente, nestes casos não existe uma tentativa de se ajustar o valor inválido informado pelo usuário, portanto fica a cargo do próprio usuário corrigir o problema. Já o erro de baixo nível, pode tentar ser contornado de alguma forma (ou não).

O funcionamento de exceptions pode ser relativamente simples, mas também permite montar soluções bastante sofisticadas. Não pretendo discutir a utilização de exceptions. Então, se quiser se aprofundar, leia o manual: http://php.net/manual/pt_BR/class.exception.php. Se você não gosta de criar exception pra isso e aquilo, talvez seja uma boa conhecer as exceptions definidas pela SPL: http://php.net/manual/pt_BR/spl.exceptions.php.

Uma solução razoável para controle de erros é criar métodos que retornam valores booleanos (true = deu certo / false = deu errado) e, opcionalmente, o método receber um array de erros que deve ser passado por referência. Então, se ocorrer algum problema, o array de erros é preenchido e é retornado o valor false.

Para erros que nunca deveriam ocorrer (por exemplo, um erro de utilização de um recurso por um programador), é possível utilizar as exceptions, mas também pode ser utilizado o lançamento de log de erro. Isso é feito pela função trigger_error. A função recebe uma mensagem e um nível de erro. Os níveis que podem ser emitidos pelo programador são:

  • E_USER_NOTICE - Quando deseja-se emitir uma notificação ao programador (não é necessariamente um erro). Por exemplo: uma função consumiu mais memória do que o esperado.
  • E_USER_WARNING - Quando deseja-se emitir um aviso ao programador (um erro, mas não muito grave). Por exemplo: não ter conseguido conectar no banco de dados (por algum motivo desconhecido), mas a página ainda pode ser gerada com um aviso ao usuário final.
  • E_USER_ERROR - Quando o erro é fatal e deve interromper a execução do script (o programador não pode lançar o sistema se um erro destes estiver sendo ocasionado). Por exemplo: um método precisava receber obrigatoriamente um tipo de dado, mas recebeu outro.
  • E_USER_DEPRECATED - Um tipo especial de aviso para indicar que um método está depreciado (não deve mais ser usado e/ou foi substituído por uma outra forma de se realizar a mesma operação).

Existem duas funções em PHP especialmente úteis para padronizar o fluxo de processamento de erros de log e exceções não tratadas com try/catch. São elas: set_error_handler e set_exception_handler. Com isso, é possível, por exemplo, armazenar alguns tipos de erros em um Banco de Dados para facilitar buscas, controlar a quantidade em determinado período, etc.

0 comentários