Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exceções no CodeIgniter

Pessoal, tenho uma situação aqui que preciso usar o bloco try/catch. No caso eu tenho um método no controller que salvar a informação no mysql chamando o metodo salvar da model. A minha questão é como criar um bloco try/catch aonde eu possa controlar a resposta. Do jeito que esta ele apresenta na tela uma página de erro dizendo o porque não está salvando no banco, porém eu gostaria redirecionar para uma página de erro específica dependendo do erro. Tentei usar o bloco try/catch direto mas não funcionou, foi ignorado. Como se trabalha nesse caso com o codeigniter?

4 respostas

Eu acredito que no método '$this->db->update("minhatabela", $meudado)' tenha algum bloco que trata o erro é por isso que não adianta eu colocar isso dentro do try/catch, mas não tenho certeza disto.

solução!

Olá Alexandre, tudo bem ?

Dando uma olhada nas docs aqui, ao que parece, quando ocorre algum erro no acesso ao banco não é lançada de fato uma exceção. Por isso talvez seu bloco catch é ignorado.

Ele recomendam fazer assim. Exemplo do próprio userguide do CI:

$this->db->simple_query('SELECT `example_field` FROM `example_table`');

$error = $this->db->error(); // Has keys 'code' and 'message'

Aí você poderia verificar se existe de fato erro pelo code ou pela message e lançar uma Exception e tratar em outro local ou mesmo já usar um show_error($suaMensagem) pra exibir sua mensagem customizada no template padrão de error page do CI.

Outro exemplo:

$this->db->insert('Table',$value);

$error = $this->db->_error_message();
if(!empty($error)) {
  throw new Exception('Your message');
}

Fontes:

Handling Errors - Queries - CodeIgniter

General Error Handling - CodeIgniter

Espero ter ajudado. Abraço!

Fala Rafael, blz? Cara deu certo o primeiro código:

$this->db->simple_query('SELECT `example_field` FROM `example_table`');

$error = $this->db->error(); // Has keys 'code' and 'message'

Depois fazendo a verificação:

if(!empty($error)) {
  throw new Exception('Your message');
}

Aí completo ficou assim:

$this->db->simple_query('SELECT `example_field` FROM `example_table`');

$error = $this->db->error(); // Has keys 'code' and 'message'

if(!empty($error)) {
  throw new Exception('Your message');
}

Nesse caso eu to relançando quando ele entra no catch, mas acredito que se deixar o throw direto, funciona também já que é na controller que a aplicação ta pedindo pra mandar pra uma página de erro no bloco catch. Como esta código está na model, acho que funciona. Vou testar depois.

Eu tinha feito uma gambi aqui que funcionou também seguindo esta question do stakeoverflow: http://stackoverflow.com/questions/7843406/codeigniter-how-to-catch-db-errors

Basicamente, tinha que ir na página error_db.php la nas views de errors e lançar uma exceção de lá..hehehehehe, bem esquisito.

Eu tinha feito a resposta que estava marcada como certa, mas não deu certo.

O meu código precisava do bloco try catch no caso de uma exceção já esperada. Existe uma coluna no mysql que é unique, então se alguem tentar gravar algo que já tenha o mesmo nome no banco vai ser lançado exceção.

Rafael, muito obrigado cara!

Abraço.

Rafael, fiz um teste completo aqui e é o seguinte: funcionou certinho a solução quando eu tentei fazer update, agora pra create não deu certo. Ao invés dele redirecionar para a página que eu defini, ele redireiona para a página padrão mostrando no caso que o erro é de duplicate entry, o que está correto, já que eu simulei uma entrada aonde o valor já está registrado no banco. Neste caso então o meu throw e até mesmo o bloco try/catch foram ignorados.

Diante disso eu resolvi voltar para aquela gambiarra lá que é o seguinte:

Na página em views/errors/html/error_db.php depois da tag

eu coloquei o seguinte código:
<?php
$message = preg_replace('/(<\/?p>)+/', '#LINE-ERROR::', $message);
throw new Exception($message);
?>

O código acima troca as tags html pelo prefixo '#LINE-ERROR::'. No caso pode se trocar para o que quiser, basta alterar este texto. Caso seja interessante saber exatamente o erro, é importante lançar a exception com esta variável $message.

Depois disso eu comentei a parte que efetivamente mostra a página de erro quando é erro de banco de dados, que é a seguinte:

<!--    <div id="container">
        <h1><?php echo $heading; ?></h1>
        <?php echo $message; ?>
    </div>-->

Feito isso funcionou pra mim tanto para create quanto para update. É uma gambi, mas funciona! hehehehe. Não sei se derrepente tem uma forma que funcione quando é para insert.

É isso aí.

Abraço.