Manejo de errores en Go (Golang)

in #cervantes6 years ago

gopher wallpaper

Manejo de errores en Go

Hasta ahora hemos visto algunos ejemplos que involucraban errores, sin embargo, aún no dedicamos tiempo a hablar sobre estos y a entender su naturaleza en el lenguaje de programación Go. Ahora es el momento para abordar el tema.

¿Qué son los errores?

Un error de software, error o simplemente fallo (también conocido por el inglés bug) es un problema en un programa de computador o sistema de software que desencadena un resultado indeseado.
Fuente: Wikipedia

Sabemos que los humanos cometemos errores, siendo los programas desarrollados principalmente por humanos, es lógico suponer que también pueden presentar errores, de hecho es bastante común y deben ser vistos como parte del proceso, algo más que solucionar/manejar, y no algo que esconder bajo la alfombra.

Si han trabajado con algún lenguaje de programación, probablemente estén pensando en el manejo de excepciones estilo try-catch o algo parecido. Go no posee excepciones, los errores son otro tipo de dato, como tal posee un valor cero (nil) y puede usarse con estructuras de control de flujo como las condicionales. De hecho, es una práctica común que algunas funciones retornen errores y, de igual forma, que la salida se prepare para manejar ese posible error comprobando si el valor retornado es o no igual a nil.

Manejando errores con Go

Es un caso bastante común que recibamos un número como cadena de texto, pero debamos realizar algún proceso con él que requiera tratarlo como un entero, algunos lenguajes de programación permiten hacer esto de manera implícita, operaciones como ”2” + 4 son totalmente válidas, aunque el resultado puede no ser el esperado. Hablando específicamente de Go, como lenguaje estrictamente tipado, requiere que la conversión se realice explícitamente. Veamos un ejemplo.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var cadena = "5"
    numero, _ := strconv.Atoi(cadena)
    fmt.Println(numero + 10) // 15
}



En primer lugar, notarán las inclusión de un paquete nuevo strconv, este nos permite realizar conversiones desde y hacia cadenas de texto, en este caso, lo requerimos para convertir una cadena a un entero, por medio de la función Atoi, esta recibe una cadena de texto y retorna un número entero y un error, cómo Go no permite declarar variables que no se están utilizando, se descarta el error utilizando el guion bajo.

Este es un programa bastante sencillo, su comportamiento es el deseado, por lo que el error es desechable, después de todo conocemos perfectamente la cadena de texto que intentamos convertir a número entero. Pero esto rara vez sucede en casos reales, normalmente no se tiene total control del contenido de la la cadena, lo que significa que existe la posibilidad de que se produzca un error y el programa debería estar preparado para manejarlo.

…
func main() {
    var cadena = "5"
    numero, err := strconv.Atoi(cadena)
    if err != nil {
        fmt.Println("Ha ocurrido un error:", err)
        return
    }
    fmt.Println(numero + 10)
}



Ahora estamos almacenando el valor del error en una variable llamada err, es común usar ese identificador para los errores, evaluamos si su valor es diferente de nil, debido a que de cumplirse esa condición significaría que ha ocurrido un error, dentro de la condicional podemos tomar las acciones que consideremos pertinentes, en este caso se imprime un mensaje por consola que muestra el contenido del error y el return termina la ejecución del programa, después de todo no es recomendable continuar un proceso que depende de un valor en el que ha tenido lugar un error.

En algunos casos, es posible que queramos tomar medidas más fuertes como detener la ejecución total del programa, podríamos generar conscientemente un panic, del cual hablaremos más detalladamente en el futuro.

Creando errores

En otros casos, es posible que necesitemos utilizar errores personalizados. Esto puede realizarse fácilmente gracias la función new del paquete errors.

package main

import (
    "errors"
    "fmt"
    "strconv"
)

func main() {
    var cadena = "5"
    numero, err := strconv.Atoi(cadena)
    if err != nil {
        panic(err)
    } else if numero == 5 {
        err = errors.New("Error, el número no debe ser 5")
        panic(err)
    }
    fmt.Println(numero + 10)
}



A esta función debemos pasarle una cadena de texto y retorna un error, de esta forma podemos crear errores personalizados según lo creamos conveniente. Este código generará un panic durante la ejecución debido a la condición establecida en el else if, lo que detendrá el programa.

Como pueden ver, manejar errores en Go es realmente sencillo, con algo de practica no vas a extrañar el manejo de excepciones.

separator.png

Publicaciones relacionadas

  1. De Python a Go (Golang)

  2. Introducción al lenguaje de programación Go (Golang)

  3. Estructuras de control de flujo en Go

  4. Array y Slice en Go (Golang)

  5. Maps en Go (Golang)

  6. Punteros en Go (Golang)

  7. Importaciones y paquetes en Go (Golang)

  8. Paquetes de terceros y alias en Go (Golang)

  9. Tipos de datos Personalizados y Métodos en Go (Golang)

  10. Estructuras: ¿Las Clases de Go (Golang)?

  11. Interfaces en Go (Golang)

  12. Interfaces vacías en Go (Golang)

Gracias por leer, espero que este artículo te resultara de provecho. Si así fue, no dudes en dejar un comentario, compartirlo y votar. Te invito a comentar cualquier duda o sugerencia, te aseguro que las leo todas. Así que, por favor, ayúdame a mejorar y continuar compartiendo contenido de calidad. Si te gusta la programación y/o la informática en general, te invito a formar parte de la comunidad Develop Spanish dónde compartimos contenido de esa naturaleza y totalmente en español. Hasta la próxima.

banner-steemit.jpg

Sort:  

Congratulations @orlmicron! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

Award for the total payout received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

SteemitBoard Ranking update - Steem Power, Followers and Following added
Presentamos el Ranking de SteemitBoard

Support SteemitBoard's project! Vote for its witness and get one more award!

Sabes, realmente entiendo de lo que hablas aquí. Del mismo modo, también me gustaría mencionar el hecho de que convertir algunos archivos a otro formato ha sido problemático para mí. Sin embargo, un día empecé a usar esta fuente https://setapp.com/es/tutoriales/como-convertir-pdf-a-texto para mejorar la forma de convertir PDF a texto, así que ahora ya no tengo problemas con esto. Si también está interesado en saber más al respecto, le aconsejo que consulte este recurso.