Validação de campos de livre edição com lupa

Tenho um campo, {cod-pessoa}, do tipo inteiro e que possui uma ligação de captura (lupa) para buscar o código de uma pessoa existente à partir de outra consulta.

Ao alterar o campo, uso o seguinte código no evento AJAX onChange:

try {
	validarPessoa();
} catch (Exception $e) {
	sc_error_message($e->getMessage());
	sc_error_exit();
}

E também faço a validação no evento onValidate:

try {
    validarPessoa();
    // Outras validações
} catch (Exception $e) {
    sc_error_message($e->getMessage());
    sc_error_exit();
}

Porém, quando tento salvar um formulário com erro em um campo, a mensagem de erro aparece duplicada:
image

Já tentei remover a validação do onValidate, mas isso faz com que o formulário não valide o campo. E retirar a validação do AJAX funciona, mas não traz o erro no campo, o que faz com o que o usuário tenha que salvar o formulário inteiro para ver que digitou um código errado.

Eu usaria o Try/Catch dentro do método ValidarPessoa(), se retornar falso, exibe mensagem.

No evento onchange daria somente a mensagem sem sc_error_exit.

Sem o sc_error_exit no onChange a mensagem continua vindo duplicada.
Tentei também retirar o sc_error_exit no AJAX e chamar somente ele no onValidate, para ver se o SC armazenava os erros entre um evento e outro, mas isso só faz salvar sem erro.

Eu passei a ignorar a mensagem retornada pela exceção no onValidate, usando a macro sc_error_message apenas para indicar que houve erro e exibir um título para os erros dos campos.

onValidate
try {
    validarPessoa();
    validarSupervisor();
    validarNegocio();
    validarUF();
} catch (Exception) {
    sc_error_message("Erro de validação.");
    sc_error_exit();
}
cod-pessoa_onChange
try {
    validarPessoa();
} catch (Exception $e) {
    sc_error_message($e->getMessage());
}

image