PHP: Ocultando erros de código

PHP: http://www.php.net/
PHP: http://www.php.net/

É muito comum após concluir todo e desenvolvimento de um projeto PHP, alguns error serem mostrados na tela, como um E_WARNING ou E_NOTICE. Isso pode ocorrer por muitos motivos, como indisponibilidade temporária no acesso ao banco de dados, tempo máximo de execução excedido, dentre outros.

Durante o desenvolvimento é altamente recomendado deixar os erros habilitados, justamente para ser feita a depuração dos mesmos, antes de finalizar o projeto. Depois de concluido, podemos desabilitar os erros, para caso haja uma eventualidade, não fique aparecendo diretamente na tela do usuário / cliente !

Para isso, vamos criar uma página PHP, onde vamos deixar os comandos para habilitar/desabilitar de forma simples e rápida, e vamos incluir a página criada nas páginas em que os erros não deverão ser exibidos. Vamos começar:

[ mostra_erros.php ]
<?php

error_reporting(0);
ini_set(“display_errors”, 0 );

?>

Definimos  de início error_reporting para ser zero, com isso nenhum erro é reportado. Logo em seguida atribuimos ao display_errors o valor zero, poderia ser também true ou false, um e zero, respectivamente. O código acima fará com que o PHP não exiba nenhum tipo de erro na tela. Para exibir todos os erros novamente utilize o código abaixo:
[ mostra_erros.php ]
<?php

error_reporting(E_ALL);
ini_set(“display_errors”, 1 );

?>

Veremos a seguir, algumas outras combinações, para ser exibido somente o erro desejado. Primeiro vamos entender o que cada erro mais comum do PHP quer dizer:
( Definições completas disponíveis no manual PHP.net: )

E_ERROR: Estes indicam erros que não podem ser recuperados, como problemas de alocação de memória. A execução do script é interrompida.
E_WARNING: Avisos em tempo de execução (erros não fatais). A execução do script não é interrompida.
E_PARSE: Erro em tempo de compilação. Erros gerados pelo interpretador.
E_NOTICE: Indica que o script encontrou alguma coisa que pode indicar um erro, mas que também possa acontecer durante a execução normal do script.
E_STRICT: Permite ao PHP sugerir mudanças ao seu código as quais irão assegurar melhor interoperabilidade e compatibilidade futura do seu código.
E_ALL: Todos erros e avisos, como suportado, exceto de nível E_STRICT

Caso você deseje exibir apenas os erros de tipo E_WARNING deve ser usado o seguinte código:

[ mostra_erros.php ]
<?php

error_reporting(E_WARNING);
ini_set(“display_errors”, 1 );

?>

Observe que agora atribuimos ao display_errors o valor 1 ( true ), para reportamos apenas os erros E_WARNING, como definimos na função error_reporting.

Podemos ainda utilizar as seguinte combinações:

[ mostra_erros.php ]
<?php

error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set(“display_errors”, 1 );

?>

Desta forma apenas os erros do tipo E_ERROR, E_WARNING e E_PARSE serão exibidos na tela. Uma outra forma seria:

[ mostra_erros.php ]
<?php

error_reporting(E_ALL ^ E_WARNING);
ini_set(“display_errors”, 1 );

?>

Com isso, todos os erros serão mostrados ( E_ALL ), com exceção do E_WARNING.

Já temos nosso arquivo de configuração ( mostra_erros.php ), agora basta chamar o arquivo de configuração nas páginas em que gostaria de alterar a configuração.

<?php

include “mostra_erros.php”;

?>

Adicione a ‘include’ acima no inicio das páginas PHP,  para que seja definido os parametros antes da página ser carregada. Quando precisar depurar algum erro nos códigos, ou acrescentar mais linhas ao código, basta alterar o arquivo mostra_erros.php e habilitar a exibição dos erros conforme foi apresentado nos exemplos acima.

Share
  • Eu entendo que certos erros padrão do php não devem estourar na cara do usuario mas o correto é o programador avaliar todos os fluxos problematicos e, se for o caso, redirecionar para paginas de erro caso alguma coisa aconteça. Esconder a sujeira para debaixo do tapete é um passo para o inferno.

  • Para um bom desenvolvimento em PHP, deve-se existir no mínimo dois ambientes (desenvolvimento e produção).
    O ideal é que tenhamos um ambiente de homologação também.

    Mas a idéia é que todos os erros sejam mostrados em desenvolvimento para que o programador possa tratar cada possível falha e em produção esses erros devem estar ocultos.

    Trabalhei em um lugar uma vez, onde existia uma Exeption criada na classe de conexão de banco de dados onde em caso de falha, um email contendo a query (que não funfou) era enviado ao email da equipe de desenvolvimento (no catch do bloco try catch).

  • Concordo Rodrigo ! Ambientes de produção e desenvolvimento são bem necessários !

    Estou redigindo um post exatamente sobre isso, como logar os erros do php, usando exception e uma função que criei para gerar logs.

    Sugiro que dê uma olhada:
    https://rafaelbiriba.com/2009/07/02/php-arquivo-de-log-personalizado.html

    Obrigado pela visita !

    Abraços,

  • Lesliê

    Boa tarde Rafael! Sabe me dizer se tem como pegar E_WARNING por exemplo tentei executar um
    mssql_query($sql,$conn);

    Digamos que sem tratar o erro me retorna se foi um erro de constraint, FK, PK (Retornando o nome da violacao se FK, etc).
    Teria como eu pegar o nome para depois tratar a mensagem de erro mais detalhada.

  • Olá Lesliê,

    Utilizando as estruturas do try e exception, você pode pegar a mensagem de erro, e tratar da forma que você desejar…

    Dê uma olhada em:
    http://www.php.net/manual/pt_BR/language.exceptions.php

    Abraços,

  • Rodrigo Marques

    Ótimo, é chato para o usuário que está acessando ver esse tipo de mensagem de erro que é desconhecido para ele! 🙂
    vlw

  • Pingback: Code School vai liberar 48 horas de acesso gratuito aos cursos online | Planeta Globo.com()

  • Pingback: OpenCart: Com o aumento do dolar, veja como atualizar o preço de todos os seus produtos via SQL | Planeta Globo.com()

  • Pingback: Ocultar Erros no PHP - Daniel Buche()

  • Werner

    Obrigadão pela ajuda, resolveu meu problema!