uqbar-project / wollok

Wollok Programming Language
GNU General Public License v3.0
60 stars 16 forks source link

Capturar errores del intérprete al ejecutar programas o en la consola REPL #1379

Closed fdodino closed 6 years ago

fdodino commented 6 years ago

A partir de la versión 1.6.5, los tests atrapan errores del intérprete y muestran el mensaje de error evitando el stack trace completo que se imprimía antes en el label del mensaje de error.

Falta hacer eso para los mensajes de error del intérprete (WollokInterpreterError.originalCause) en programas y consola REPL:

(repasando el issue #690) error690.png

Juancete commented 6 years ago

Estoy trabajando en el Issue para la consola en primer lugar, logré reutilizar el código de WollokExceptionUtils utilzado para los test. El problema es que solo puedo arrojar el error del interpreter, pero cuando intento arrojar el archivo y línea me arroja del syntetic file que utiliza el REPL, al igual que su nro de línea.

Veo que originalCause da un Throwable, cosa que no tiene ni línea ni URL, es correcto?

screenshot from 2018-09-03 14-57-38

Por ahora estoy buscando como llegar al lugar donde tratar el problema para el Wollok Program. Si alguien tiene algún tipo donde encontrarlo es bienvenido.

Juancete commented 6 years ago

Bueno, terminé encontrando que hay una clase WollokInterpreterConsole en project.wollok. El tema es que tengo que utilizar la lógica que se creó para los test y se encuentra en otro proyecto. screenshot from 2018-09-03 22-28-11 Ahora el problema es que no tiene sentido importar desde el manifest wollok.launcher, sino que la lógica que se creó para los test (WollokExceptionUtils), no debería encontrarse el project.wollok? de hecho que diferencia hay con WollokExceptionExtensions de project wollok @fdodino ?

fdodino commented 6 years ago

Hay un WollokExceptionExtensions en el proyecto Wollok, ése podés utilizar. Por otra parte me llama la atención que no tengas el stack trace filtrado, que debería recuperarte la info que estás buscando. En WollokRepl lo tenés:

    def dispatch void handleException(Throwable e) {
        println(e.stackTraceAsString.errorStyle)
    }

    def dispatch void handleException(WollokProgramExceptionWrapper e) {
        // Wollok-level user exception
        println((e.exceptionClassName + ": " + e.wollokMessage).errorStyle)
        val errorLine = e.wollokException
            .convertStackTrace
            .toList
            .map [ stackDTO | stackDTO.toLinkForConsole ]
            .join(System.lineSeparator)

        if (errorLine !== null && !errorLine.equals("")) {
            printlnIdent(errorLine.errorStyle)
        }
    }

    def dispatch void handleException(WollokInterpreterException e) {
        if (e.lineNumber > numberOfLinesBefore) {
            printlnIdent('''«WVM_ERROR» («e.lineNumber - numberOfLinesBefore»): «e.nodeText»:'''.errorStyle)
        }

        if (e.cause !== null) {
            indent
            handleException(e.cause)
        }
    }