La declaración de prueba consta de un bloque de prueba, que contiene una o más declaraciones. { } siempre debe usarse, incluso para declaraciones individuales. Deben estar presentes un bloque de captura, un bloque de finalización o ambos. Esto nos da tres formas para la sentencia try:
- trata de atraparlo
- intentar… finalmente
- intentar… atrapar… finalmente
Un bloque catch contiene declaraciones que especifican qué hacer si se lanza una excepción en el bloque try. Si alguna declaración dentro del bloque try (o en una función llamada desde dentro del bloque try) arroja una excepción, el control se cambia inmediatamente al bloque catch. Si no se lanza ninguna excepción en el bloque try, se omite el bloque catch. Puede anidar una o más declaraciones de prueba. Si una declaración de prueba interna no tiene un bloque catch, en su lugar se usa el bloque catch de la declaración de prueba adjunta. El bloque finalmente siempre se ejecutará después de que el bloque de prueba y el bloque de captura hayan terminado de ejecutarse. Siempre se ejecuta, independientemente de si se lanzó o detectó una excepción.
try – catch como expresión
Las excepciones en Kotlin son similares y diferentes en comparación con las de Java. En Kotlin, throwable es la superclase de todas las excepciones, y cada excepción tiene un seguimiento de pila, un mensaje y una causa opcional. La estructura de try-catch también es similar a la que se usa en Java. En Kotlin, así es como se ve una instrucción try-catch:
Kotlin
try { // some code to execute catch (e: SomeException) { // exception handle } finally { // oprional finally block }
Al menos un bloque de captura es obligatorio y el bloque de finalmente es opcional, por lo que se puede omitir. En Kotlin, try-catch es especial ya que permite que se use como una expresión. En este artículo, veremos cómo podemos usar try-catch como expresión.
Ejemplo
Escribamos un programa simple que tome un número como entrada y asigne su valor a una variable. Si el valor ingresado no es un número, detectamos la excepción NumberFormatException y asignamos -1 a esa variable:
Kotlin
fun main (args: Array<String>) { val str="23" val a: Int? = try { str. toInt () } catch (e: NumberFormatException) {-1} println (a) }
Producción:
23
Ahora, intentemos algo loco e intentemos deliberadamente lanzar la excepción:
Kotlin
fun main (args: Array<String>){ val str="abc" val a: Int? = try { str. toInt () } catch (e: NumberFormatException) { -1 } printin (a) }
Producción:
-1
El uso de try-catch lo ayudará mucho en casos extremos, ya que se pueden usar como una expresión.
Explicación
La razón por la que podemos usar try-catch como expresión es que tanto try como throw son expresiones en Kotlin y, por lo tanto, se pueden asignar a una variable. Cuando usas try-catch como una expresión, se devuelve la última línea del bloque try o catch. Por eso, en el primer ejemplo, obtuvimos 23 como valor devuelto y obtuvimos -1 en el segundo ejemplo.
Aquí, una cosa a tener en cuenta es que no se aplica lo mismo al bloque «finally», es decir, escribir el bloque » finally » no afectará el resultado:
Kotlin
fun main (args: Array<String>) { val str="abc" val a: Int = try { str.toInt () } catch (e: NumberFormatException) { -1 } finally { -2 } printIn (a) }
Producción:
-1
Como puede ver, escribir el bloque finalmente no cambia nada.
En Kotlin, todas las excepciones están desmarcadas, lo que significa que no necesitamos aplicar try-catch en absoluto. Esto es bastante diferente a Java, donde si un método arroja una excepción, debemos rodearlo con try-catch . Aquí hay un ejemplo de una operación IO en Kotlin:
Kotlin
fun fileToString(file: File) : String { // readAllBytes throws TOException, // but we can omit catching it fileContent = Files.readAllBytes (file) return String (fileContent) }
Como puede ver, no necesitamos envolver las cosas con try-catch si no queremos. En Java, no podíamos continuar sin manejar esta excepción.
Publicación traducida automáticamente
Artículo escrito por eralokyadav2019 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA