No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Try Catch

19/37
Recursos

Aportes 23

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Estoy empezando con los estudios en programaci贸n, pero no entend铆 la Excepci贸n de Try Catch, me toco ir a YouTube para ver otra forma de explicarlo y realmente hay Tutores que dan ejemplos mas sencillos para entenderlo

fun main(args: Array<String>) {

var nombre : String? = null

// En kotlin, esto regresar铆a null, 
// pero la propiedad length nunca la ejecutara.
print(nombre?.length)

// Simular una excepi贸n, tratar de evitar el !!
try {
	nombre!!.length
	// Lanzar una exepci贸n NullPointerException
	//throw NullPointerException("Ha ocurrido un error")
} catch (exception : NullPointerException ) {
	println("Ha ocurrido un error")
} finally {
	println("Finalmente ha ocurrido un error.. Cerrando aplicaci贸n")
}


val primerValor = 10
val segundoValor = 0

// Asignando el valor que regresa un try/catch
val resultado : Int = try { primerValor / segundoValor } catch  (exception: Exception) { 0 }
print(resultado)
}




OJO: CON EL FINALLY

Dentro de un:

try {
	code...
}

Tu c贸digo correr谩 a menos que alguna l铆nea dentro del try genere una excepci贸n, lo que lanzar谩 el catch. Cambe mencionar que a esta parte del c贸digo se le asigna un scope especifico, por lo que si tratas de usar una variable que fue definida dentro de este scope, no podr谩s usarla dentro de tu catch.

try { 
	code...
} catch(ex : Exception)  { 
	println(ex.message);
	run_exception_code();
} 

El catch solo correr谩 si se genera una excepci贸n, y normalmente lo usamos como medio de validaci贸n donde podemos generar un LOG del evento, asignar un valor por defecto o mandar tu propia excepcion, para ser manejada m谩s adelante.

try { 
	code...
} catch(ex : Exception)  { 
	println(ex.message);
	moreCode...
}  finally {
	finalCode
}

Esta parte del c贸digo siempre correra, ya sea que corra bien tu try o haya habido una excepci贸n鈥 incluso correr谩 si haces un return o tiras una excepci贸n鈥 por lo que normalmente se usa para cerrar recursos que o conexiones que se hayan abierto鈥

Yo considero que cada vez que se pueda usar el try para evitar un excepcion y que la aplicacion falle se debe usar no lo considero un abuso de la herramienta mas bien para eso se invento.

Ojo!

  • Tu no puedes tener un catch o finally sin un try
  • Tu no puedes poner codigo entre el try y el catch, o el catch y el finally.
    por ejemplo:
try { callRiskyCode( ) }
x = 7
catch(e: Bad Exception) {}
  • un try puede estar seguido de un catch o un finally
  • Un try puede tener multiples catch blocks.

Esta explicacion esta en el libro Head First Kotlin en la pagina 244. Un gran libro en ingles que recomiendo mucho!

El 煤ltimo comentario del v铆deo no lo entend铆 bien, 驴a que se refer铆a con que se debe utilizar lo menos posible? 驴el try/catch? porque realmente un buen c贸digo tiene que tener un buen manejo de errores y es fundamental tambi茅n para tener un c贸digo seguro; por eso no entend铆 muy bien ese comentario, quiz谩 se refer铆a a otra cosa y no capt茅 la idea; espero que alguien pueda aclararme esa duda.

En este ejemplo podemos ver como seg煤n la excepci贸n que ocurra ser谩 el bloque de c贸digo que se ejecutara.

println("Ingrese un n煤mero entero: ")

    try {
        val input = readLine()?.trim()
        if (input.isNullOrEmpty()) {
            throw NullPointerException("No se proporcion贸 ninguna entrada")
        }

        val number = input.toInt()
        println("El n煤mero ingresado es: $number")
    } catch (e: NumberFormatException) {
        println("Error: El valor ingresado no es un n煤mero entero v谩lido")
    } catch (e: NullPointerException) {
        println("Error: ${e.message}")
    } finally {
        println("Fin del programa")
    }

Por ejemplo al no ingresar nada y solo dar un 鈥淓nter鈥 el 鈥渋f鈥 arrojara la excepci贸n de NullPointerException lo que mandara al catch de (e: NullPointerException) ejecutando la l铆nea println(鈥淓rror: ${e.message}鈥) viendo en la consola 鈥淓rror: No se proporcion贸 ninguna entrada鈥.
En caso de ingresar un n煤mero con decimales o una cadena de texto causara una 鈥淣umberFormatException鈥 lo cual mostrara en consola 鈥淓rror: El valor ingresado no es un n煤mero entero v谩lido鈥.

Espero les ayude esto, saludos 鉁岋笍

`try-catch` es una estructura de control utilizada en programaci贸n para manejar errores o excepciones que pueden ocurrir durante la ejecuci贸n de un bloque de c贸digo. En resumen, el bloque `try` contiene el c贸digo que se quiere ejecutar y el bloque `catch` maneja cualquier excepci贸n que pueda ocurrir dentro del bloque `try`. Si ocurre una excepci贸n en el bloque `try`, el control se transfiere al bloque `catch` correspondiente, donde se puede manejar la excepci贸n de manera apropiada, como mostrando un mensaje de error o realizando acciones correctivas. Esto permite que el programa siga ejecut谩ndose de manera controlada, incluso cuando se encuentran errores inesperados.

驴Para que sirven el Double Bang y el Safe Call?

el doble bang (!!) se utiliza para afirmar que una variable no es nula y lanzar una excepci贸n si lo es, mientras que el modificador ? se usa para indicar que una variable puede ser nula y permite operaciones seguras en ese contexto.

Ten en cuenta que es una buena pr谩ctica utilizar el operador seguro (?) en lugar del doble bang (!!) siempre que sea posible, ya que el operador seguro evita excepciones no deseadas en tiempo de ejecuci贸

Entiendo que el Try Catch sirve por ejemplo en este caso para ocultar el tipo de error del servidor, me parece que por seguridad es bueno usarlo, ya que por errores de servidores puedes hacer ataques, como por ejemplo saber si al iniciar sesion el correo o la contrase帽a esta mal escrito, algunos sitios solo ponen error, no dan mas informacion por lo mismo.

S铆, es una buena pr谩ctica usar try-catch en Kotlin (y en cualquier otro lenguaje de programaci贸n) para manejar excepciones en el c贸digo.

Las excepciones son eventos que ocurren durante la ejecuci贸n del c贸digo y que pueden interrumpir su funcionamiento normal. Cuando ocurre una excepci贸n, el flujo de control del programa se desv铆a del camino normal y puede ser necesario tomar medidas para manejar la excepci贸n y evitar que el programa se detenga o se comporte de manera inesperada.

La estructura try-catch permite capturar excepciones que se lanzan dentro del bloque try, y manejarlas de manera adecuada dentro del bloque catch correspondiente. Esto permite que el programa contin煤e su ejecuci贸n normalmente, en lugar de detenerse por completo.

Adem谩s, el manejo de excepciones puede ayudar a identificar y solucionar errores en el c贸digo. Al capturar y registrar las excepciones que ocurren durante la ejecuci贸n, se puede obtener informaci贸n valiosa sobre los problemas que se presentan y corregirlos.

En resumen, el uso de try-catch es una buena pr谩ctica para manejar excepciones en Kotlin y asegurarse de que el programa se ejecute de manera adecuada y sin errores.

El c贸digo try/catch/finally esta malo.
鈥渇inally鈥 no esta bien usado!!

var nombre : String? = null
El ? es que es nullable
nombre?.lenght es una SafeCard
KOTLIN te devuelve el null.


Para gestionarlo este tipo de errores:

Usamos los try catch.
try {
throw NullPointerException(鈥淩eferencia nula鈥)
} catch (exception : NullPointerException){
println(鈥淗a ocurrido un error鈥)
} finally {
println( 鈥淔inalmente ha ocurrido un error . . Cerrando aplicaci贸n鈥)
}


Ejemlo de uso de librer铆a matem谩tica

val primerValor = 0
val segundoValor = 10
val resultado : Int = try { primerValor / segundoValor } catch (exception : Exception) { 0 }
println(resultado)


Se usa en ciertos casos de librer铆as espec铆ficas, no hay que abusar de ellas

Para quienes a煤n est谩n confundidos con el null-safety, les explico y les dejo un enlace de Android Developers que lo explica bastante bien:
https://developer.android.com/codelabs/basic-android-kotlin-compose-nullability?hl=es-419#0

En Kotlin, los valores de tipo _null _se pueden declarar tranquilamente as铆:

val miVariableNula = null 

Sin embargo, si queremos asignarle valores nulos a otro tipo de variables que no sean 煤nicamente null, lo puedes hacer. De este modo, estar铆amos expandiendo el rango de valores que puede tener la variable. Pero para ello, tenemos que usar ?.
El operador ? ampl铆a el dominio de una variable para que adem谩s acepte null, la convierte en tipo nullable. De esta forma, le dices a Kotlin 鈥淓y, esta variable podr铆a ser nula鈥, ya sea porque un usuario envi贸 un formulario vac铆o o no ha iniciado sesi贸n para acceder a tu aplicaci贸n, por ejemplo.

En ocasiones, vas a desear decirle a Kotlin que est谩s completamente seguro de que el valor que recibir谩 una variable no ser谩 null, y si lo es, es porque algo anda mal con el dise帽o de la aplicaci贸n. Para comunicarle esto a Kotlin, utilizas el operador double-bang !!. A partir de esa l铆nea de c贸digo, una variable que hab铆as declarado antes como nullable a trav茅s del operador ?, deja de serlo, lo cual ayuda a controlar bastante m谩s el comportamiento del programa de ah铆 en adelante. Si ocurre una excepci贸n de tipo NullPointerException en alg煤n punto del programa luego de que hayas declarado tu variable como non-nullable con el operador !!, es porque algo anda mal con esa variable que est谩 recibiendo un valor nulo sin que t煤 lo hayas permitido.
Esto es muy positivo porque es mejor que te des cuenta que algo anda mal con el programa en lugar de que presente errores sin que t煤 lo sepas por valores nulos que fueron reasignados a la variable que no quieres que los reciba.

Cuando te das cuenta que dicha variable est谩 recibiendo valores nulos sin tu permiso (es decir, se est谩 lanzando NullPointerException) puedes actuar en consecuencia. Puedes analizar el programa y entender por qu茅 tu variable est谩 recibiendo null y modificarlo. Tambi茅n puedes manejar la excepci贸n NullPointerException usando un bloque de try catch. O tambi茅n puedes evitar la nulidad en la declaraci贸n utilizando el operador _elvis _?: que intenta asignarle un valor a una variable, pero si dicho valor resulta ser nulo, entonces asigna otro valor por defecto.

Es por esto que se dice que Kotlin es un lenguaje con null-safety, es decir, que provee herramientas para un excelente control de las variables nulas.
Espero les haya servido.

Para quienes a煤n est谩n confundidos con el null-safety, les explico:

En Kotlin, los valores de tipo null se pueden declarar tranquilamente as铆:

val miVariableNula = null 

Sin embargo, si queremos asignarle valores nulos a otro tipo de variables que no sean 煤nicamente null, lo puedes hacer. De este modo, estar铆amos expandiendo el rango de valores que puede tener la variable. Pero para ello, tenemos que usar ?.
El operador ? ampl铆a el dominio de una variable para que adem谩s acepte null, la convierte en tipo nullable. De esta forma, le dices a Kotlin 鈥淓y, esta variable podr铆a ser nula鈥, ya sea porque un usuario envi贸 un formulario vac铆o o no ha iniciado sesi贸n para acceder a tu aplicaci贸n, por ejemplo.

En ocasiones, vas a desear decirle a Kotlin que est谩s completamente seguro de que el valor que recibir谩 una variable no ser谩 null, y si lo es, es porque algo anda mal con el dise帽o de la aplicaci贸n. Para comunicarle esto a Kotlin, utilizas el operador double-bang !!. A partir de esa l铆nea de c贸digo, una variable que hab铆as declarado antes como nullable a trav茅s del operador ?, deja de serlo, lo cual ayuda a controlar bastante m谩s el comportamiento del programa de ah铆 en adelante. Si ocurre una excepci贸n de tipo NullPointerException en alg煤n punto del programa luego de que hayas declarado tu variable como non-nullable con el operador !!, es porque algo anda mal con esa variable que est谩 recibiendo un valor nulo sin que t煤 lo hayas permitido.
Esto es muy positivo porque es mejor que te des cuenta que algo anda mal con el programa en lugar de que presente errores sin que t煤 lo sepas por valores nulos que fueron reasignados a la variable que no quieres que los reciba.

Cuando te das cuenta que dicha variable est谩 recibiendo valores nulos sin tu permiso (es decir, se est谩 lanzando NullPointerException) puedes actuar en consecuencia. Puedes analizar el programa y entender por qu茅 tu variable est谩 recibiendo null y modificarlo. Tambi茅n puedes manejar la excepci贸n NullPointerException usando un bloque de try catch. O tambi茅n puedes evitar la nulidad en la declaraci贸n utilizando el operador _elvis _?: que intenta asignarle un valor a una variable, pero si dicho valor resulta ser nulo, entonces asigna otro valor por defecto.

Es por esto que se dice que Kotlin es un lenguaje con null-safety, es decir, que provee herramientas para un excelente control de las variables nulas.
Espero les haya servido.

El bloque try-catch en Kotlin y Java se utiliza para el manejo de excepciones en el c贸digo. El bloque try encierra el c贸digo que puede lanzar una excepci贸n y el bloque catch se utiliza para manejar la excepci贸n. La excepci贸n se puede capturar en un bloque catch y se puede procesar de acuerdo a las necesidades. El bloque try debe estar seguido de un bloque catch o un bloque finally o ambos. Adem谩s, en Kotlin, el bloque try tambi茅n se puede usar como una expresi贸n que devuelve un valor.

try {
    int x = 10;
    int y = 0;
    int z = x / y;
    System.out.println("Resultado: " + z);
} catch (ArithmeticException e) {
    System.out.println("No se puede dividir entre cero!");
}

En este ejemplo, el bloque try intenta dividir un entero entre cero. Esto generar谩 una excepci贸n ArithmeticException, que se manejar谩 en el bloque catch. El resultado ser谩: 鈥淣o se puede dividir entre cero!鈥.

Es recomendable evitar los Try / Catch, puedes validar de otras maneras

var name:String? = null

if (name != null)
{
    println("Hello $name")
}
else
{
    println("name is null exit ")
    return
}
try {
        nombre!!.length;
    }catch (excepcion : NullPointerException){//Para ser mas especificos en la captura del error.
        println("Ha ocurrido un error");
    } finally {
        println("Agrega un valor a la variable: ");
        nombre = readln();
        println("Ahora la variable contiene el dato $nombre");
    }
var nom: String? = null
    try {
        throw NullPointerException("Referencia null")
    }catch (exepcion: NullPointerException){
        println("Ha ocurrido un error")
    }finally {
        println("Cerrando aplicacion")
    }

    val primerVal = 10
    val segundoVal= 0
    val resultado : Int = try {primerVal / segundoVal} catch (exp : Exception){ 0 }
    println(resultado)

Hola Comunidad.
Con respecto al comentario: no se debe de abusar de los manejos de errores.

Puede sonar controversial pero comparto el siguiente enlace:
https://elizarov.medium.com/kotlin-and-exceptions-8062f589d07

Esta en ingles pero tiene un ejemplo bastante claro.

Code desarrollado en la clase:

OJO: Es una mala pr谩ctica y debes limitar su uso al m谩ximo.

fun main(args: Array<String>) {
    
    var nombre : String? = null
    try {
        throw NullPointerException("Null reference")
    } catch (excepcion : NullPointerException){
        println("Ha ocurrido un error")
    } finally {
        println("Finalmente ha ocurrido un error... Cerrando aplicacion")
    }

    val primerValor = 10
    val segundoValor = 0
    val resultado : Int = try {
        primerValor/segundoValor
    } catch (excepcion : Exception) {
        0
    }
    println(resultado)
}

Muy util el try catch