Como usar as propriedades "HandleExceptions" e "Handled" nos eventos?
Com o novo motor de extensibilidade, ao contrário do VBA, é possível ter várias várias implementações para um único evento. Estas implementações são codificadas em extensões que ficam registadas no ERP e a ordem de execução dos eventos subscritos é definida pela ordem do próprio registo ou através do atributo Order (utilizando o namespace Primavera.Extensibility.Attributes) se os eventos se encontrarem dentro da mesma extensão. O seguinte exemplo demonstra o evento AntesDeGravar da FichaArtigos, subscrito mais do que uma vez na mesma extensão: Desta forma, é possível ter uma pilha de execução do mesmo evento, o que permite gerir as exceções que ocorrem de duas formas distintas: Este procedimento é controlado pelo valor da propriedade "HandleExceptions": A operação do formulário não é interrompida e, no final, o sistema apresenta uma mensagem de erro com informação sobre a exceção que ocorreu. A operação do formulário é cancelada. Por predefinição, esta propriedade assume o valor "True" para todas as implementações de eventos de Plataforma e o valor "False" para os restantes. Quando as exceções transitam para os eventos seguintes, ficam disponíveis na propriedade Exceptions. O exemplo seguinte mostra como uma exceção não controlada que ocorre na primeira subscrição do evento é passada para o evento seguinte. Pode ainda definir o valor "True" para a propriedade "Handled" para intervir e cancelar a execução de uma pilha de implementações do evento em qualquer momento. Através do vídeo Tratamento de Exceções podemos ver as duas propriedades a serem utilizadas em conjunto para controlar as exceções e a execução da pilha.using Primavera.Extensibility.Attributes;
public class UiFichaArtigos1 : FichaArtigos
{
[Order(0)]
public override void AntesDeGravar(ref bool Cancel, ExtensibilityEventArgs e)
{
base.AntesDeGravar(ref Cancel, e);
}
}
public class UiFichaArtigos2 : FichaArtigos
{
[Order(1)]
public override void AntesDeGravar(ref bool Cancel, ExtensibilityEventArgs e)
{
base.AntesDeGravar(ref Cancel, e);
}
}
Valor Comportamento True Exceções não tratadas nas implementações devem ser tratadas pelo ERP. False As exceções não tratadas nas implementações não devem ser tratadas pelo ERP. public class UiFichaArtigos1 : FichaArtigos
{
[Order(0)]
public override void AntesDeGravar(ref bool Cancel, ExtensibilityEventArgs e)
{
e.HandleExceptions = true;
throw new Exception("Erro ao gravar na extensão 1.");
}
}
public class UiFichaArtigos2 : FichaArtigos
{
[Order(1)]
public override void AntesDeGravar(ref bool Cancel, ExtensibilityEventArgs e)
{
string msg = "UiFichaArtigos2.AntesDeGravar" + Environment.NewLine;
msg += string.Format("Exceções: {0}", e.Exceptions.Count);
if (e.Exceptions.Count > 0)
{
foreach (var item in e.Exceptions)
{
msg += "Exceção = " + item.Exception.Message + Environment.NewLine;
}
}
PSO.Dialogos.MostraMensagem(StdPlatBS100.StdBSTipos.TipoMsg.PRI_SimplesOk, msg);
}
}
login para deixar a sua opinião.