Bloco try...catch

24 views
Skip to first unread message

Bernardo Castro

unread,
Jun 4, 2012, 6:57:14 PM6/4/12
to kohan...@googlegroups.com
A algum tempo tenho usado o bloco “tr...catch” erradamente nos sites que tenho desenvolvido. Por exemplo, ter duas funções em apenas um bloco catch. Veja o código.

http://pastebin.com/3JNEnqq0

Se parar para pensar esse não é um forma 100% seguro para tratamento de exceções. No bloco acima se o método de adicionar endereço falhar o cadastro do cliente vai está errado. Tinha ciencia desse problema mas não levava a serio.

Qual seria a melhor forma de garantir o cadastro do cliente? O código acima foi somente um exemplo, tenho um caso real atualmente que é o seguinte.
Tenho um processo de cadastro de cliente onde é necessário inserir os serviços adquiridos, criar a fatura, enviar e-mails de notificação.(varios e-mails)

http://pastebin.com/UYQFuUT8

O último método de enviar e-mail “notificar” e sem dúvida o grande vilão, nele a grandes chances de ocorrer um erro por falha na conexão, host fora do ar. Etc.


Criando vários blocos “catch” eu consigo gerenciar detalhadamente o erro caso aconteça em qualquer parte do código.

Se a última etapa falhar, que é a de notificação, posso ainda carregar uma página de sucesso e avisar somente que ocorreu um erro no envio do e-mail.

Se acontecer uma falha na parte de adicionar o serviço ao cliente, que seria muito ruim, posso simplesmente apagar o cadastro do cliente feito no primeiro processo.


Essa seria a melhor forma de controlar os possíveis erros ? Alguém faz algo diferente disso?


Newton Wagner

unread,
Jun 4, 2012, 7:39:48 PM6/4/12
to kohan...@googlegroups.com
Bernardo,

Não há necessidade de ter vários blocos de Try/Catch. O Catch funciona
como um "else if", ou seja, você pode ter várias condições:

try {
...
}
catch (Email_Exception $e) {
// tratamento de erro de envio de e-mail
}
catch (Model_Exception $e) {
// tratamento de erro no modelo (de insert, por exemplo)
}
catch (Exception $e) {
// tratamento de erro geral, não identificado
}


No código acima, você pode especializar a classe Exception pra
disparar diferentes tipos de erros, e assim tratar o erro na hora de
"lançar" a exceção.

Uma observação é que não achei no manual do PHP um exemplo com vários
"Catches" com um único Try. Está escrito que é possível, mas seria bom
testar. ;)




2012/6/4 Bernardo Castro <bs.c...@gmail.com>:
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php"
> dos Grupos do Google.
> Para ver esta discussão na web, acesse
> https://groups.google.com/d/msg/kohana-php/-/PgEhMsjT0psJ.
> Para postar neste grupo, envie um e-mail para kohan...@googlegroups.com.
> Para cancelar a inscrição nesse grupo, envie um e-mail para
> kohana-php+...@googlegroups.com.
> Para obter mais opções, visite esse grupo em
> http://groups.google.com/group/kohana-php?hl=pt-BR.



--
Newton Wagner

msn/gtalk: newt...@gmail.com
twitter: http://twitter.com/newtonwagner
site: http://www.newtonwagner.net/

felipe bastos

unread,
Jun 4, 2012, 9:52:05 PM6/4/12
to kohan...@googlegroups.com

Bom cara .. eu nao li tudo mas lhe daria tais dicas ..

Um cliente tem endereco
Outras coisas tem endereco

Entao .. é mais conveniente endereco servir para tudo ..

$endereco ... ORM::factory('endereco');

$cliente-endereco ... $endereco;
Tabela cliente campo endereco_id

$fornecedor-endereco ... ORM::factory('endereco');
Tabela fornecedor campo endereco_id

Vc nao esta validando o endereco ..

Como uma pessoa chegou a me pedir para fazer formularios pra ela nao preencher (isso mesmo kkk)

Vc poderia salvar o endereco mesmo sem dados .. vou aproveitar pra corrigir isso no meu codigo tbm (erros de banco com exception, eu simplesmente mando um erro amigavel pro user)

if(! $endereco-save()){
throw new ...Database...Exception();
}

Ai teria sentido usa try ..

Vlw pela duvida .. e fica a dica

felipe bastos

unread,
Jun 4, 2012, 9:53:54 PM6/4/12
to kohan...@googlegroups.com

E pode fazer a sequencia de catches pq funciona no php5 ..

O exception captado sera de acordo com o tipo de exception disparado

Waldson Patricio

unread,
Jun 4, 2012, 10:18:39 PM6/4/12
to kohan...@googlegroups.com
 Pois é voce pode ter quantos catches de quantas exceções voce quiser. Só acho exagero voce criar uma exceção para cada situação possível. Se forem do mesmo contexto, acho mais interessante voce criar um código e passar pra exceção. trhow new Cliente_Exception("Mensagem X", Cliente_Exception::SITUACAO_X);

outra observação é a questão da atomicidade. Acho que essa operação tem que ser atômica, ou seja, ou executa tudo ou não executa nada. Dá uma olhada em transações.

Flw.

2012/6/4 felipe bastos <feli...@gmail.com>

felipe bastos

unread,
Jun 4, 2012, 10:24:24 PM6/4/12
to kohan...@googlegroups.com

Rpz .. a principio .. meu caso ..

Eu insiro mesmo que o usuario nao preencha nada .. eu achei um absurdo o cliente pagar, exigir e nao querer preencher .. deu uma trabalheira retirar validacoes .. mas foi do jeito que ele quis ..

Mas, com relacao ao exception .. observe que ele so vai ser executado em caso de falha do banco.

Se nao inseriu, nao vai dar rollback .. é um caso de falha critica de banco que merece um exception.

Nao vi nenhuma referencia a filters nem rules no banco (nao faz check()) .. entao .. banco falhou, exception

Bernardo - Sudeste Hosting

unread,
Jun 5, 2012, 6:56:17 AM6/5/12
to kohan...@googlegroups.com
@Newton sua abordagem clareou minha mente.

Em vez de ciar Exception unicas posso criar Exception que sirva para varias situações. como Email_Exception() vai ser tudo relacionado a e-mail.
Vai reduzir bem os arquivos e códigos.

Obrigado.
Atenciosamente,
Bernardo Sepulveda de Castro
------- ------- ------- -------- -------- --------
Sudeste Hosting...
Ideias e Soluções Web
www.sudestehosting.com.br
(21)3305-3105

Társis Lima

unread,
Jun 5, 2012, 11:51:24 AM6/5/12
to kohan...@googlegroups.com
Seria interessante usar transações.

Bernardo - Sudeste Hosting

unread,
Jun 5, 2012, 4:39:12 PM6/5/12
to kohan...@googlegroups.com
Bom, desde ontem a noite até agora tentando encontrar a melhor solução.
A melhor forma foi "blocos aninhados uns dentro dos outros" permitido apartir do php 5.3

Detalhes da solução: http://pastebin.com/BtzZt2aS
[!] Já vi que tem alguns pequenos erros de variaveis errada, nada que interfira no resultado do progresso.
Reply all
Reply to author
Forward
0 new messages