Ser Programador

Como utilizar o cftry, o comando try do Adobe ColdFusion

O cftry do ColdFusion é um tanto versátil, e vamos explorar um pouco disso neste artigo.


Tecnicamente o funcionamento do cftry é o mesmo das demais linguagens, salvo as particularidades do próprio ColdFusion.


Caso você não saiba como exatamente usar o comando try em linguagens de programação, este comando serve para que você tenha um controle inteligente sobre a saída de erros de determinadas rotinas do seu script.

Com este comando você pode fazer uma série de validações, e concentrar a saída dos erros de forma customizada por uma única estrutura, ao invés de ficar fazendo várias saídas de mensagens durante a execução do script.

Falando principalmente do cftry do ColdFusion, você consegue inclusive omitir os erros de script não mapeados e registrar este erro para futura conferência. Veremos isso em detalhes mais a diante.


A sintaxe do cftry é até bastante simples. Vamos construir um exemplo, testando se determinado dado foi fornecido em um formulário pelo usuário:

		<cftry>
			<cfif Len(form.nome_completo) eq 0>
				<cfthrow message="Nome não foi informado corretamente">
			</cfif>

			<cfcatch>
				<cfoutput>#cfcatch.message#</cfoutput>
			</cfcatch>
		</cftry>
	

Na linha 1, abrimos o cftry;

Na linha 2, esperamos que o front-end envie pelo método post dados de um formulário onde há um input do tipo text, com name de nome_completo. Envio de dados pelo método post ficam automaticamente disponíveis num objeto chamado form, instanciado automaticamente pelo ColdFusion;

Ainda na linha 2, utilizamos a função Len e passamos por parâmetro para essa função o campo que esperamos testar (nome_completo). Esta função retorna a quantidade de caracteres existentes na string fornecida como parâmetro. Uma vez com a quantidade de caracteres obtida, usamos o operador condicional equal para checar se a quantidade de caracteres obtida equivale a zero;

Para entender mais sobre os Operadores Condicionais, dê uma olhada NESTE ARTIGO;

Na linha 3 utilizamos o comando cfthrow para disparar uma mensagem de erro através do cftry;

Na linha 6, abrimos o cfcatch para tratar o erro lançado pelo cfthrow;

Na linha 7, utilizamos o campo message presente no objeto cfcatch, automaticamente instanciado pelo próprio comando cfcatch;


Só com o exemplo que temos acima, já é suficiente para que você consiga fazer o controle efetivo do lançamento de erros do seu script, mas há algumas coisas ainda mais legais a se saber sobre o cftry.



Por exemplo, você consegue pegar qualquer erro de script não mapeado, e registrar esse erro para futura conferência. Similar a um registro de log de erro, porém aqui você consegue obter esse "log" das rotinas específicas das quais você implementar esse método.


Vamos imaginar um cenário hipotético de uma aplicação HTML5 que usa o service worker ou cache manifest para guardar scripts e estrutura html no cache do navegador do usuário. Imaginemos que você atualize os campos do formulário de determinado arquivo html que é mantido no cache, formulário este que envia dados para o seu back-end.

Se o usuário não atualizou a versão local da aplicação limpando o cache do navegador, provavelmente ele ainda tem a versão antiga do formulário. Uma vez que seu back-end já está atualizado para receber os novos campos, caso você não tenha desenvolvido uma tratativa para lidar com os envios de dados na estrutura antiga, você provavelmente terá erros do tipo element undefined durante a execução do script.

Vamos utilizar o exemplo anterior do cftry como exercício. Imaginemos que o nome antigo do campo nome_completo é primeiro_nome:

		<cftry>
			<cfif Len(form.nome_completo) eq 0>
				<cfthrow message="Nome não foi informado corretamente">
			</cfif>

			<cfcatch type="application">
				<cfset erro_do_cf = cfcatch>
			</cfcatch>
		</cftry>
	

Caso o objeto form na linha 2 tenha apenas o campo antigo primeiro_nome, o ColdFusion irá disparar em tela um erro com a mensagem:

		Element NOME_COMPLETO is undefined in FORM.
	

Se você é observador, você notou que eu adicionei um atributo chamado type com valor application no cfcatch da linha 6. Isso fará com que o erro padrão do ColdFusion seja disparado;

Já na linha 7, eu apenas guardo o objeto cfcatch (instanciado automaticamente pelo próprio comando cfcatch), em uma variável erro_do_cf;


A partir desse ponto, você pode criar um envio de e-mail para uma caixa de e-mails de sua preferência, colocando o erro completo do ColdFusion no corpo do e-mail, inclusive preencher com demais dados de sua preferência, como por exemplo, guardar os dados recebidos por post em um JSON que irá juntamente no corpo do e-mail:

		<cftry>
			<cfif Len(form.nome_completo) eq 0>
				<cfthrow message="Nome não foi informado corretamente">
			</cfif>

			<cfcatch type="application">
				<cfset mailConfig = StructNew()>
				<cfset mailConfig.erro_do_cf = cfcatch>
				<cfset mailConfig.form_json = serializeJSON(form)>

				<cfset mailError = createObject("component", "mailError")>
		        <cfset resultadoSendMail = mailError.sendMail(config = mailConfig)>
			</cfcatch>
		</cftry>
	

Entre as linhas 7 e 9, estamos instanciando um novo objeto struct para guardar as informações que farão parte do e-mail, e preenchendo esse objeto com os dados;

Na linha 11, estamos instanciando um objeto proveniente de um cfcomponent fictício chamado mailError, que neste exemplo tem por ideal fazer o envio de e-mail dos erros da aplicação;

Na linha 12, estamos chamando o método sendMail fictício do objeto mailError, passando como um argumento chamado config os dados do corpo do e-mail guardados na struct mailConfig, para que este método construa o e-mail e faça o envio;


Você pode utilizar essa mesma abordagem para lançar uma mensagem de erro padrão, caso exista qualquer erro não mapeado no código:

		<cftry>
			<!--- Seu script aqui, fazendo as coisas da vida, do universo e tudo mais... --->

			<cfcatch type="any">
				<cfoutput>Ocorreu um erro inesperado. Notifique o administrador do sistema.</cfoutput>
			</cfcatch>
		</cftry>
	

O atributo type com valor any no cfcatch da linha 4, apenas serve para prevenir que a mensagem de erro padrão do ColdFusion seja apresentada na tela, dando prioridade para a mensagem do cfoutput da linha 5;