terça-feira, 1 de setembro de 2009

Tratamento de Exceção

Olá a todos,

No X++, a exemplo de outras linguagens, também utiliza blocos try e catch para tratar exceções, ou seja, para tratar uma situação que normalmente não ocorre e representa algo de estranho ou inesperado no sistema.
Por default o Ax traz a enum Exception com os tipos fixos de exceção que poderiam ocorrer. Mas ela pode ser considerada insuficiente para determinados casos ou determinadas customizações.


Por isso observe o código abaixo e tente visualizar o que eh exibido no final de sua execução.


public static void ErrorTest(Args _args)
{;
Try
{
throw SalesPurch_BR::Purch;
info("Sem exception");
}
catch(Salespurch_BR::Sales)
{
info(enum2value(SalesPurch_BR::Sales));
}
catch(Salespurch_BR::Purch)
{
info(enum2value(SalesPurch_BR::Purch));
}
}


No infolog aparece a mensagem Compra. Com isso em mente podemos expandir o exemplo para algo mais representativo, algo que atenda as necessidades de nossas customizações.

Por exemplo:

Public void open(FileName _fileName)
{
container openRecord;
;
Try{
file = CustVendOutPaym::newFile(_filename, 'w', 'CommaIO');

if (!file || file.status() != IO_Status::Ok)
{
throw IOException::FileOpenException;
}
openRecord = conins(openRecord,1,'Open Statement');
}
catch(IOException::FileOpenException)
{
error(strfmt("@SYS75767",_filename));
}
}

Onde IOException é um novo Enum Type e FileOpenException é um de seus Elements. Lembrando que o bloco catch poderia muito bem estar em um escopo superior.

Para dar continuidade a este desenvolvimento de exceções, também se poderia criar classes especialistas para cuidar da exception, assim como a classe Error que está na AOT. Dessa forma teríamos uma classe IOException com um método FileOpenException que se responsabilizará por finalizar o processamento de forma segura para a aplicação.


3 comentários:

Ricardo Pichler disse...
Este comentário foi removido pelo autor.
Ricardo Pichler disse...

my hero!
take a look:
http://www.daxbr.com.br/?p=1093

lele disse...

Oq rege as exceptions no AX são os numeros inteiros, assim como no C++.

Então não se limita a enums, e sim aos inteiros em geral. Com certeza tem gente que consegue achar utilidade para isso hehe.

Testa isso e veja o output:

static void Job1(Args _args)
{
;
try
{
throw 1.3;
}
catch(0)
{
info('erro 0');
}
catch(1)
{
info('erro 1');
}
catch(1.3)
{
info('erro 1.3');
}
catch
{
info('erro generico');
}
}