Sabem aquela telinha que exibe um erro e depois derruba o smartclient? Pois então, tem como exibir o erro mas continuar o processo até o ponto do erro sem derrubar o client. Abaixo segue um exemplo para tratar esta situação: Vou simular um erro numa consulta SQL, quando o sistema identificar o erro uma tela de aviso irá ser exibida, mas ao invés de finalizar a rotina, o sistema continuará até um certo ponto, sugiro que aprimore a tela de aviso para que o usuário te envie o erro.
Static Function SuaFuncao() Local bBlock := ErrorBlock() //A função ErrorBlock define a atuação de um manipulador (handler) //de erros sempre que ocorrer um erro em tempo de execução. //Para isso, o manipulador de erro, é especificado com um bloco de código ErrorBlock( {|e| ChecErro(e)}) //A função ChecErro é padrão do sistema, era se encarrega //de receber o erro e exibir um alerta na tela para o usuario //Você pode criar sua propria tela de aviso, no final deste //fonte mostro a sintaxe desta funcao BEGIN SEQUENCE //O comando BEGIN SEQUENCE define uma estrutura sequencial //de controle dentro do fluxo de execução de um programa, //permitindo a sua interrupção na ocorrência de um determinado evento. BeginSql Alias TMPSB1 SELECT * FROM SB1010 WHERE D_E_L_E_T_ = '' AND XXX //Simulo o erro ORDER BY B1_COD EndSql /*SEU CODIGO*/ ErrorBlock(bBlock) RECOVER //RECOVER - Define um ponto de recuperação, //dentro do bloco de sequência, para o qual o //fluxo de execução será desviado após a //execução de um comando BREAK. ErrorBlock(bBlock) END SEQUENCE ReturnPara saber mais acesse o TND Begin Sequence - http://tdn.totvs.com/display/framework/BEGIN+SEQUENCE+...+END ErrorBlock - http://tdn.totvs.com/pages/viewpage.action?pageId=23888930
//Sintaxe da Função Static Function ChecErro(e) IF e:gencode > 0 Help( " ",1,"ERR_FORM",,e:Description,3,1) lRet:=.F. Endif Break Return(lRet)