<h1>Manejo de errores en Go
<p dir="auto"><em>Hasta ahora hemos visto algunos ejemplos que involucraban <strong>errores, sin embargo, aún no dedicamos tiempo a hablar sobre estos y a entender su naturaleza en el lenguaje de programación <strong>Go. Ahora es el momento para abordar el tema.
<h2>¿Qué son los errores?
<blockquote>
<p dir="auto">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.<br />
Fuente: <a href="https://es.wikipedia.org/wiki/Error_de_software#C%C3%B3digos_de_errores_de_lenguajes_de_programaci%C3%B3n" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Wikipedia
<p dir="auto">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.
<p dir="auto">Si han trabajado con algún lenguaje de programación, probablemente estén pensando en el manejo de excepciones estilo <em>try-catch o algo parecido. <strong>Go no posee excepciones, los <strong>errores son otro tipo de dato, como tal posee un valor <em>cero (<code>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 <code>nil.
<h2>Manejando errores con Go
<p dir="auto">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 <code>”2” + 4 son totalmente válidas, aunque el resultado puede no ser el esperado. Hablando específicamente de <strong>Go, como lenguaje estrictamente tipado, requiere que la conversión se realice explícitamente. Veamos un ejemplo.
<pre><code>package main
import (
"fmt"
"strconv"
)
func main() {
var cadena = "5"
numero, _ := strconv.Atoi(cadena)
fmt.Println(numero + 10) // 15
}
<p dir="auto"><br /><br />
En primer lugar, notarán las inclusión de un paquete nuevo <a href="https://godoc.org/strconv" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">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 <code>Atoi, esta recibe una cadena de texto y retorna un número entero y un error, cómo <strong>Go no permite declarar variables que no se están utilizando, se descarta el error utilizando el guion bajo.
<p dir="auto">Este es un programa bastante sencillo, su comportamiento es el deseado, por lo que el <strong>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.
<pre><code>…
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)
}
<p dir="auto"><br /><br />
Ahora estamos almacenando el valor del error en una variable llamada <code>err, es común usar ese identificador para los errores, evaluamos si su valor es diferente de <code>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 <code>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.
<p dir="auto">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 <code>panic, del cual hablaremos más detalladamente en el futuro.
<h2>Creando errores
<p dir="auto">En otros casos, es posible que necesitemos utilizar errores personalizados. Esto puede realizarse fácilmente gracias la función <code>new del paquete <code>errors.
<pre><code>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)
}
<p dir="auto"><br /><br />
A esta función debemos pasarle una cadena de texto y retorna un <code>error, de esta forma podemos crear errores personalizados según lo creamos conveniente. Este código generará un <code>panic durante la ejecución debido a la condición establecida en el <code>else if, lo que detendrá el programa.
<p dir="auto">Como pueden ver, manejar <strong>errores en <strong>Go es realmente sencillo, con algo de practica no vas a extrañar el manejo de excepciones.
<p dir="auto"><center><img src="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png" alt="separator.png" srcset="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png 1x, https://images.hive.blog/1536x0/https://cdn.steemitimages.com/DQmXF55A7pDHvVu4K73h6TgCoH5UpC1WUHFAFhn76NUVgUC/separator.png 2x" />
<h2>Publicaciones relacionadas
<ol>
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/de-python-a-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">De Python a Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/introduccion-al-lenguaje-de-programacion-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Introducción al lenguaje de programación Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/estructuras-de-control-de-flujo-en-go" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Estructuras de control de flujo en Go
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/array-y-slice-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Array y Slice en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/maps-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Maps en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/punteros-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Punteros en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/importaciones-y-paquetes-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Importaciones y paquetes en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/paquetes-de-terceros-y-alias-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Paquetes de terceros y alias en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/tipos-de-datos-personalizados-y-metodos-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Tipos de datos Personalizados y Métodos en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/estructuras-las-clases-de-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Estructuras: ¿Las Clases de Go (Golang)?
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/interfaces-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Interfaces en Go (Golang)
<li><p dir="auto"><a href="https://steemit.com/cervantes/@orlmicron/interfaces-vacias-en-go-golang" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Interfaces vacías en Go (Golang)
<p dir="auto">Gracias por leer, espero que este artículo te resultara de provecho. Si así fue, no dudes en dejar un <strong>comentario, <strong>compartirlo y <strong>votar. Te invito a comentar cualquier <strong>duda o <strong>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 <a href="https://discordapp.com/invite/8cFAFTZ" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Develop Spanish dónde compartimos contenido de esa naturaleza y totalmente en español. Hasta la próxima.
<p dir="auto"><img src="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg" alt="banner-steemit.jpg" srcset="https://images.hive.blog/768x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg 1x, https://images.hive.blog/1536x0/https://cdn.steemitimages.com/DQmQU5fep6GDnVe1KD4jRgxwD6DcBNvwWPTx82DKBWeciew/banner-steemit.jpg 2x" />
Congratulations @orlmicron! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
<p dir="auto"><a href="http://steemitboard.com/@orlmicron" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"><img src="https://images.hive.blog/768x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png" srcset="https://images.hive.blog/768x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png 1x, https://images.hive.blog/1536x0/https://steemitimages.com/70x80/http://steemitboard.com/notifications/payout.png 2x" /> Award for the total payout received <p dir="auto"><sub><em>Click on the badge to view your Board of Honor.<br /> <sub><em>If you no longer want to receive notifications, reply to this comment with the word <code>STOP <p dir="auto"><strong><span>Do not miss the last post from <a href="/@steemitboard">@steemitboard: <table><tr><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-steem-power-followers-and-following-added" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"><img src="https://images.hive.blog/768x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png" srcset="https://images.hive.blog/768x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png 1x, https://images.hive.blog/1536x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png 2x" /><td><a href="https://steemit.com/steemitboard/@steemitboard/steemitboard-ranking-update-steem-power-followers-and-following-added" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">SteemitBoard Ranking update - Steem Power, Followers and Following added<tr><td><a href="https://steemit.com/spanish/@steemitboard/presentamos-el-ranking-de-steemitboard" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link"><img src="https://images.hive.blog/768x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png" srcset="https://images.hive.blog/768x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png 1x, https://images.hive.blog/1536x0/https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmfRVpHQhLDhnjDtqck8GPv9NPvNKPfMsDaAFDE1D9Er2Z/header_ranking.png 2x" /><td><a href="https://steemit.com/spanish/@steemitboard/presentamos-el-ranking-de-steemitboard" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Presentamos el Ranking de SteemitBoard <blockquote> <p dir="auto">Support <a href="https://steemit.com/@steemitboard" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">SteemitBoard's project! <strong><a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Vote for its witness and <strong>get one more award!