Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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); 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= [...]Abraço!
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!
É 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
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
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 :)