Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo de Tarso F. M.

Omitir os erros sem ter que usar o @

Recommended Posts

Olá pessoal,

Não consegui encontrar uma solução para o seguinte problema, vou usar uma situação de conexão com banco de dados, mas isso pode ser aplicado a outras situações também.

Em ambiente de desenvolvimento (localhost) sempre mostro tudo no PHP: erros, notices, warnings, é tudo escancarado mesmo, e obviamente quando "está no ar", nada disso deve aparecer. Pois bem, quando temos uma conexão com banco de dados, temos:

// Conexão com o MySQL utilizando PDO
try {
    $pdo = new PDO("mysql:host=".$db_hostname."; dbname=".$db_name.";", $db_username, $db_password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
} catch(Exception $exception) {
    die("Erro ao conectar o banco de dados", utf8_encode($exception->getMessage()), $exception->getLine());
}
Se eu executar dessa forma, caso algum erro de conexão aconteça, antes de executar o que está na exceção (die), é gerado um Warning com a mesma mensagem exibida ali no catch. Por conta disso, como eu sei que se caso algum erro a conexão, sei que o sistema lançará a exceção e vou poder tratar o erro normalmente, entretanto, para evitar que esse warning seja gerado, eu tenho que colocar o @ na 2ª linha:
$pdo = @new PDO("mysql:host= [...]

Pensava que esse warning não seria gerado justamente pelo fato de estar utilizando um try/catch, mas não... Pergunta: existe como, então, evitar que esses warnings sejam gerados, uma vez que a intenção do try/catch é justamente tratar isso, mas sem ter que desabilitar a exibição de todos os warnings e também sem utilizar o @?

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em produção, é bom deixar display_errors em off. Isso resolve seu problema. Pode fazer isso via ini_set() mesmo

E recomendo mudar o bloco do catch. Mostre uma página personalizada, mais amigável que apenas a mensagem de erro :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Beraldo,

Na verdade eu já mostro uma página personalizada, só mudei ali para die( ) para exemplificar mesmo, eu utilizo uma função que trata qualquer erro, enviando um e-mail com a descrição do erro para o administrador (eu, no caso hehehe) e depois exibe uma página falando que houve um erro e que o administrador já foi notificado, e que a pessoa pode tentar acessar novamente mais tarde ou oferece outras opções para o usuário.

Quanto ao display errors off isso já acontece, o que eu queria mesmo era saber se existe alguma forma de não gerar o warning em ambiente de produção sem utilizar o @... Pensava que existiria alguma forma mais adequada disso ser feito, mas pelo jeito não existe, né?

Outras situações que comentei que podem acontecer erros que geram warning é quando você quer, por exemplo, criar um arquivo com fopen( ) e dá algum erro de permissão:

$handle = fopen('log.txt', 'w+');

Se algum erro acontecer aqui, o PHP gera o warning... Sei que posso tratar depois, e é isso que faço:

$handle = @fopen('log.txt', 'w+');
if(!$handle) {
    // faça alguma coisa!
}

Mas só queria saber se existe alguma forma diferente de fazer esse tipo de tratamento sem ter que usar o @...

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só o arroba, mesmo.

E ele existe pra ser usado.

Muita gente acha que ele é gambiarra, mas não é.

Tem muita gente que o usa como gambiarra, por isso gera essa sensação

Não vejo problema algum em usar o arroba para suprimir erros que são imprevisíveis e que não podem ser tratados com try/catch. Por exemplo o que você citou ou mesmo uma conexão a um SGBD, que pode estar offline.

Falo sobre isso neste link: http://rberaldo.com.br/boas-praticas-programacao-php/#arroba

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falou tudo, Beraldo, era nesse ponto que queria chegar... Também não acho que usar o @ seja gambiarra, exatamente como acontece em situação em que não se tem controle sobre os erros e avisos que podem ser gerados.

Muito obrigado pelo apoio!

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.