Artigo
· Jun. 7, 2023 4min de leitura

Como obter informações de erro de resultados de compilação em massa de rotina/classe

Quando você compila rotinas ou classes no terminal, os resultados da compilação são exibidos na tela, portanto, mesmo que ocorra um erro, é fácil verificar.Se você deseja obter apenas informações de erro, precisa planejar um pouco.

O seguinte descreve como obter informações de erro do resultado da compilação em lote de rotinas/classes.

 

para rotinas

Para rotinas de compilação em massa em um namespace no Terminal, o método CompileAll() da classe %Library.Routine. use

O exemplo de execução a seguir é o resultado de rotinas de compilação em lote no namespace USER. Estou recebendo erro de compilação em TestRoutine1.

USER>do ##class(%Routine).CompileAll()
 
Compiling in namespace USER at 11:50:47
Routine1.MAC TestRoutine1.MAC
TestRoutine1.MAC - Errors compiling routine
TestRoutine1.INT(3) : Error 8: <NOLINE> : '     do sub3()'
 
2 routines compiled with 1 errors at 11:50:47 in 00:00:00.030
USER>

Se houver um grande número de rotinas, os resultados de saída irão fluir e desaparecer da tela, então salve o conteúdo de saída para o dispositivo atual em um arquivo e obtenha informações de erro do arquivo salvo.

1) Salve o resultado da compilação em um arquivo

método CompileAll() . Especifique o nome do arquivo com o caminho completo como o segundo argumento do

Se o dispositivo especificado no segundo argumento estiver aberto, esse método gravará o log nesse dispositivo.

Portanto, uma vez aberto o arquivo no novo modo de gravação ( o comando OPEN ). usando

// defina o caminho completo do arquivo de log para uma variável
set log="C:\temp\result.log"
//abre um arquivo em um novo modo de gravação
open log:"NWS"
//Especifique o nome do arquivo para gerar o log para o segundo argumento e execute a compilação em massa.
do ##class(%Routine).CompileAll(,log)

//Feche o arquivo.
close log

 

2) Obtenha informações de erro do arquivo criado em 1).

Aqui está um exemplo de como abrir um arquivo e extrair o nome da rotina e defini-lo como uma variável se contiver a string "Erros ao compilar a rotina" quando ocorrer um erro.

 //Gerar instância para operação de arquivo de string
 set file=##class(%Stream.FileCharacter).%New()
 //Link para arquivo
 do file.LinkToFile("c:\temp\result.log")
 //Extraia informações durante a leitura até que o final do arquivo seja detectado 
 //Quando o final do arquivo é detectado, a propriedade AtEnd é definida como 1
 while file.AtEnd=0 {
  set reco=file.ReadLine()
  //Quando a linha de leitura contém uma string de caracteres de erro
  if reco["Errors compiling routine" {
    //Adquirido porque o nome da rotina está incluído no primeiro espaço delimitado
    set rtn=$piece(reco," ",1)
  }
  //Se o nome da rotina estiver vazio, vá para o próximo loop
  if $get(rtn)="" {
    continue
  }
  //Defina o nome da rotina para o subscrito da variável local
  set val(rtn)=""
 }
 zwrite val

Ao executar no terminal  

set file=##class(%Stream.FileCharacter).%New()
do file.LinkToFile("c:\temp\result.log")
while file.AtEnd=0 { set reco=file.ReadLine() if reco["Errors compiling routine" { set rtn=$piece(reco," ",1)} if $get(rtn)="" { continue } set val(rtn)=""}
zwrite val

 

para classe

Para compilar classes em massa em um namespace no Terminal, o método CompileAll() da classe %SYSTEM.OBJ. use

O exemplo de execução abaixo é o resultado da compilação em lote das classes no namespace USER e ocorreu um erro de compilação em Dummy.ErrorClass1.

USER>do $system.OBJ.CompileAll("ck")
 
 Started compilation with qualifier 'ck' at 04/20/2023 12:17:49.
 Error #5373: Class '%Library.Strig' used by class 'Dummy.ErrorClass1:property:XYZ' does not exist Skip class Dummy.ErrorClass1
 , 72 Compiling class Compiling class CookBook.Class1
 Compiling class A.b3
 Compiling class A.B1
     "omit"
 Compiling routine F4.GoldMember.1
 While compiling the class MyApp.MyService.Test
 Compiling routine MyApp.MyService.Test.1
 Caught 1 error while compiling 1.091s.

Se o segundo argumento for passado por referência, a informação do erro será definida como uma variável de array.  

USER>do $system.OBJ.CompileAll("ck",.log)

USER>zwrite log
log=1
log(1)="error #5373: class 'Dummy.ErrorClass1:property:XYZ' classes used by '%Library.Strin' does not exist"
log(1,"caller")="findalldependencyclasses+149^%occDepend"
log(1,"code")=5373
log(1,"dcode")=5373
log(1,"domain")="%ObjectErrors"
log(1,"namespace")="USER"
log(1,"param")=2
log(1,"param",1)="%Library.Strin"
log(1,"param",2)="Dummy.ErrorClass1:property:XYZ"
log(1,"stack")=$lb("e^findalldependencyclasses+149^%occDepend^2","e^findalldependencyclasses+58^%occDepend^1","e^findalldependencyclasses+8^%occDepend^1","e^IncludeClasses+44^%occCompile^1","e^CompileList+59^%occCompile^1","e^CompileList+23^%apiOBJ^1","e^CompileAll+15^%apiOBJ^1","e^zCompileAll+1^%SYSTEM.OBJ.1^1","d^^^0")

Se ocorrerem vários erros, o número de erros é definido diretamente na variável especificada para criação de log.

Veja como obter apenas a mensagem de erro:

for i=1:1:log { write log(i),! }

Para obter informações sobre como compilar classes e rotinas mapeadas, consulte o artigo da comunidade de desenvolvedores abaixo: 

Para compilar com rotinas de classe mapeadas, especifique o modificador do compilador "/mapped=1" ou "/mapped". Por exemplo: 

[Exemplo 1] Obter lista de classe e compilar 

do $System.OBJ.GetClassList(.list,"/mapped")
// build your list starting from .list
do $System.OBJ.Compile(.list)  

 

[Exemplo 2] Compilar todas as classes   

do $system.OBJ.CompileAll("/mapped")   
Discussão (0)1
Entre ou crie uma conta para continuar