CursosEmpresasBlogLiveConfPrecios

Poniendo a prueba el manejo de excepciones

Clase 16 de 21 • Curso de Python Intermedio: Comprehensions, Lambdas y Manejo de Errores

Clase anteriorSiguiente clase

Contenido del curso

Preparación antes de empezar
  • 1
    Algunas cosas que aprenderás sobre Python en este curso

    Algunas cosas que aprenderás sobre Python en este curso

    01:36
  • 2
    El Zen de Python

    El Zen de Python

    08:30
  • 3
    ¿Qué es la documentación?

    ¿Qué es la documentación?

    04:33
Entorno virtual
  • 4
    ¿Qué es un entorno virtual?

    ¿Qué es un entorno virtual?

    03:56
  • 5
    El primer paso profesional: creación de un entorno virtual

    El primer paso profesional: creación de un entorno virtual

    08:30
  • 6
    Instalación de dependencias con pip

    Instalación de dependencias con pip

    09:53
  • quiz Entorno virtual

Alternativa a los ciclos: comprehensions
  • 7
    Listas y diccionarios anidados

    Listas y diccionarios anidados

    12:32
  • 8
    List comprehensions

    List comprehensions

    07:39
  • 9
    Dictionary comprehensions

    Dictionary comprehensions

    06:00
  • quiz Alternativa a los ciclos: comprehensions

Conceptos avanzados de funciones
  • 10
    Funciones anónimas: lambda

    Funciones anónimas: lambda

    05:42
  • 11
    High order functions: filter, map y reduce

    High order functions: filter, map y reduce

    10:40
  • 12
    Proyecto: filtrando datos

    Proyecto: filtrando datos

    14:35
  • quiz Conceptos avanzados de funciones

Manejo de errores
  • 13
    Los errores en el código

    Los errores en el código

    08:54
  • 14
    Debugging

    Debugging

    12:27
  • 15
    Manejo de excepciones

    Manejo de excepciones

    10:53
  • 16
    Poniendo a prueba el manejo de excepciones

    Poniendo a prueba el manejo de excepciones

    04:12
  • 17
    Assert statements

    Assert statements

    07:55
  • quiz Manejo de errores

Manejo de archivos
  • 18
    ¿Cómo trabajar con archivos?

    ¿Cómo trabajar con archivos?

    06:52
  • 19
    Trabajando con archivos de texto en Python

    Trabajando con archivos de texto en Python

    12:27
  • quiz Manejo de archivos

Conclusión
  • 20
    Reto final: Juego del Ahorcado o Hangman Game

    Reto final: Juego del Ahorcado o Hangman Game

    03:43
  • 21
    Continúa tu camino profesional con Python

    Continúa tu camino profesional con Python

    02:17
    Julian Camilo Hermida Delgado

    Julian Camilo Hermida Delgado

    student•
    hace 5 años

    Solución al reto (le añadí un bucle while para que el programa se ejecute indefinidamente, hasta que el usuario ingrese un valor válido):

    def divisors(num): divisors = [] for i in range(1, num + 1): if num % i == 0: divisors.append(i) return divisors def run(): while True: try: num = int(input('Ingresa un número: ')) if num < 0: raise ValueError print(divisors(num)) print("Terminó mi programa") break except ValueError: print("Debes ingresar un entero positivo") if __name__ == '__main__': run()
      Luis Arturo Cruz Cruz

      Luis Arturo Cruz Cruz

      student•
      hace 5 años

      El viejo ciclo 1-x...

      tenor.png

      Hice un tutorial de scripting sobre eso:

      https://platzi.com/tutoriales/1468-bash-shell/10524-el-uso-de-do-while-para-un-menu-sencillo/

      Lucas Sanchez

      Lucas Sanchez

      student•
      hace 5 años

      Buen aporte. Le agregaría a la condicional IF lo siguiente:

      if num < 0 or num == 0:

      Para verificar que no haya escrito un numero 0.

    Ana Guzmán

    Ana Guzmán

    student•
    hace 5 años
    <def divisor(num): try: if num < 0: raise ValueError("ingresa un número positvo") divisors =[i for i in range(1, num + 1) if num % i == 0] return divisors except ValueError as ve: print(ve) return False def run(): try: num = int(input(f'Ingresa un número: ')) print(divisor(num)) print("termino mi programa") except ValueError: print("ingresa un número") if __name__ =='__main__': run()>
      Juan Sebastian Mesa

      Juan Sebastian Mesa

      student•
      hace 5 años

      Me gustó tu implementación porque mantuviste las dos excepciones.

      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Muy limpio & fácil de leer. Eres la mejor !

    Royer Guerrero Pinilla

    Royer Guerrero Pinilla

    student•
    hace 5 años

    Solución reto

    try: num = int(input('Enter a number: ')) if num < 0: raise Exception('Negative number is not valid') print(divisors(num)) print('[!] Finish...') except ValueError: print('[!] Solo puedes añadir numeeros') except Exception: print('[!] El numero no puede ser negativo')
      Manuel Espitia

      Manuel Espitia

      student•
      hace 5 años

      Me dio '''NameError: name 'exception' is not defined'''

      Royer Guerrero Pinilla

      Royer Guerrero Pinilla

      student•
      hace 5 años

      Maybe es tu version de python

    Usuario anónimo

    Usuario anónimo

    user•
    hace 4 años

    👾 Mejorando el control de las excepciones de nuestro proyecto.

    def divisors(num): try: if num < 0: raise ValueError('Ingresa solo números positivos') else: divisors = [i for i in range(1, num + 1) if num % i == 0] return divisors except ValueError as value_error: print(value_error) return str(num) + " No es nu numero positivo" def run(): try: num = int(input("Ingresa un número: ")) print(divisors(num)) print("Terminó mi programa") except ValueError: print("Debes ingresar un número") if __name__ == "__main__": run()
    Erik Alejandro Garcia Duarte

    Erik Alejandro Garcia Duarte

    student•
    hace 5 años
    def run(): divisors = lambda num: [x for x in range(1, num + 1) if num % x == 0] try: num = int(input('Ingresa un numero: ')) if num < 0: raise ValueError('Solo ingresa numeros positivos') print(divisors(num)) print("Termino") except ValueError: print('Solo Ingrese Numeros Positivos :|') if __name__ == '__main__': run()
      David Eduardo Bueno Núñez

      David Eduardo Bueno Núñez

      student•
      hace 5 años

      Gran uso de list comprehension y lambda

      Manuel Espitia

      Manuel Espitia

      student•
      hace 5 años

      Excelente, este sí me dio! Gracias por compartirlo.

    Juan Ignacio Arcidiacono

    Juan Ignacio Arcidiacono

    student•
    hace 5 años
    def divisors(num): divisors = [] try: if num > 0: for i in range(1,num + 1): if num % i == 0: divisors.append(i) return divisors if num < 0: raise ValueError ('No se puede ingresar numeros negativos') except ValueError as ve: print(ve) return False def main(): try: num = int(input('Ingresar numero: ')) print(divisors(num )) except ValueError: print('No es un numero') if __name__ == "__main__": main()
      LEANDRO DARIO MAMANI

      LEANDRO DARIO MAMANI

      student•
      hace 5 años

      justo buscaba algo que combinara los 2 casos, gracias!!

      Max Baldiviezo

      Max Baldiviezo

      student•
      hace 4 años

      gracias

    Oscar Mayorga Aparicio

    Oscar Mayorga Aparicio

    student•
    hace 5 años

    Solucion al reto, dejando tambien la validacion del ingreso solo de numeros:

    def run(): try: num = int(input("INGRESA NUMERO")) try: if num <0: raise ValueError("No se puede ingresar numeros negativos") print(divisors(num)) except ValueError as ve: print(ve) except ValueError: print("DEBES INGRESAR UN NUMERO")
      Osvaldo Olguín

      Osvaldo Olguín

      student•
      hace 4 años

      Try anidados, interesante

      David Carrillo Castillo

      David Carrillo Castillo

      student•
      hace 3 años

      Excelente amigo, estuve intentandolo de la misma manera

    Jonathan Emmanuel Pumares Chab

    Jonathan Emmanuel Pumares Chab

    student•
    hace 4 años

    En ocasiones nuestro código tendrá la posibilidad de que salte más de un tipo de excepción, y por lo tanto podemos emplear más de un except dentro de un try.

    def dividir(numero): return 1 / numero def run(): try: numero = int(input('Escribe un numero: ')) print(divisor(numero)) except ValueError: print('Solamente se aceptan numeros') except ZeroDivisionError: print('No se puede dividir entre 0') except: print('Se encontro un error') if __name__ == '__main__': run()

    Si el try lanza cualquier otra tipo de excepción no manejada, será manejada por el último except.

    Pascal Salvador Miranda Valdés

    Pascal Salvador Miranda Valdés

    student•
    hace 4 años

    Mi reto

    debugging-sample-carbon.png

    Explicacion

    El codigo esta dentro de un bucle while eterno que hace al programa pedir un numero como entrada hasta recibir el valor esperado. Usando condicionales y manejo de errores, el programa al recibir una entrada invalida salta a la siguiente iteracion con continue, reseteando todo el proceso y volviendo a pedir una nueva entrada. Una vez recibida la entrada valida, el programa finaliza.

    Christian Ricardo Conchari Cabrera

    Christian Ricardo Conchari Cabrera

    student•
    hace 5 años
    def divisors(num): return [i for i in range (1,num+1) if num%i == 0] def run(): try: num = int(input("Ingrese un número: ")) if num < 0: raise Exception("Ingrese un número positivo.") print(divisors(num)) print("Termino el programa") except ValueError: print("Debes ingresar un número.") except Exception: print("Debes ingresar un número positivo.") if __name__=='__main__': run()
      Moisés Manuel Morín Hevia

      Moisés Manuel Morín Hevia

      student•
      hace 5 años

      Buen aporte !

    Piero Alejandro Cahuano Vera

    Piero Alejandro Cahuano Vera

    student•
    hace 4 años

    Vi que el profe tomo un fragmento de código y le hizo una indentación a la derecha, ¿alguien sabe el comando con el qué hizo eso?

      José Aguilar

      José Aguilar

      student•
      hace 4 años

      Hola, para tabular varias líneas en VSC es Ctrl + ¿
      Para quitar tabulación Ctrl + ?

      Fer Torres

      Fer Torres

      student•
      hace 4 años

      Seleccionas todo el fragmento deseado de código y presionas TAB

    Víctor Manuel Rosenstiehl Colón

    Víctor Manuel Rosenstiehl Colón

    student•
    hace 4 años

    Saludos, en algunos lenguajes, el abuso de try, puede generar degradación del rendimiento del programa, por lo que se recomienda hacer programación defensiva, por ej, evaluar si un objeto está instanciado o si los parámetros de entrada son válidos y lanzar la exepción hacia arriba, para hacer un único control en la capa superior, donde se hacer el respectivo logeo y manejo del error; esto es válido también para python? o es lícito hacer un control de flujo con try impunemente?

      Víctor Manuel Rosenstiehl Colón

      Víctor Manuel Rosenstiehl Colón

      student•
      hace 4 años

      La respuesta es assert, en la siguiente clase :)

    Julián Andrés Rodas Laverde

    Julián Andrés Rodas Laverde

    student•
    hace 4 años

    Para manejar los dos mensajes de error, y como el error del ingreso de cadenas levanta es un ValueError, utilice el NameError, para con el reise levantar el otro error, y mostar el mensaje correcto según sea el caso, así:

    def my_divisor(a): divisor = [] for i in range(1,a+1): if a % i == 0: divisor.append(i) return divisor def run(): try: num = int(input('Ingrese un Número =')) if num < 0: raise NameError('Los datos solo deben ser números enteros ') print(my_divisor(num)) print("Gracias por utilizar nuestro Sistema") except NameError as ne: print(ne) except ValueError: print('Deben ser datos numéricos') if __name__ == '__main__': run()
      Alexander Ivan Campos

      Alexander Ivan Campos

      student•
      hace 4 años

      Buen código compañero solo para tener en cuenta: Las excepciones vienen en diferentes tipos, y el tipo se imprime como parte del mensaje: los tipos en el ejemplo son ZeroDivisionError, NameError and TypeError.

      Julián Andrés Rodas Laverde

      Julián Andrés Rodas Laverde

      student•
      hace 4 años

      Muchas Gracias por tu comentario, Lo tendre en cuenta.

    Dan Yael Sajarópulos Verdugo

    Dan Yael Sajarópulos Verdugo

    student•
    hace 4 años

    Para el reto creé una excepción específica en caso de que el usuario ingrese un número negativo:

    class ValueIsNegative(Exception): pass def divisors(num): divisors = [] for i in range(1, num+1): if num % i == 0: divisors.append(i) return divisors def run(): try: num = int(input("Ingresa un número: ")) if num < 0: raise ValueIsNegative print(divisors(num)) except ValueError: print("Debes ingresar un número") except ValueIsNegative: print("Debes ingresar un número positivo") if __name__ == "__main__": run()
    Carlos S. Aldazosa

    Carlos S. Aldazosa

    student•
    hace 5 años

    Cuál es el método correcto para volver a pedir el imput del usuario en caso que su input sea incorrecto? Usar recursión llamando a la función que pide el input o con un ciclo while?

      Andres muñoz

      Andres muñoz

      student•
      hace 5 años

      con un ciclo

      while True: el codigo aqui
      Arturo Juárez Sánchez

      Arturo Juárez Sánchez

      student•
      hace 5 años

      puedes manejar excepciones.

    Juan Alfonso

    Juan Alfonso

    student•
    hace 4 años

    Modifiqué el archivo original y ahora es un proceso para traducir un decimal a binario y a este le añadí las excepciones de type y value para los valores o tipo de vlaor no validos en cada proceso.

    # -*- coding: utf-8 -*- def binary(num): try: if num <= 0: raise ValueError("El número debe ser positivo o mayor a cero") binary = [] divisor = num while divisor > 0: binary.append(divisor % 2) divisor = int(divisor / 2) return binary except ValueError as ve: print(ve) def run(): try: num = int(input('Ingresa un numero: ')) str_bin = ''.join([str(b) for b in binary(num)])[::-1] print('El numero {} en binario es: {}'.format(num, str_bin)) except ValueError: print("Debes añadir un número") except TypeError: print("El valor añadido no tiene un formato valido") if __name__ == '__main__': run()
    Jose Cardenas

    Jose Cardenas

    student•
    hace 5 años

    Para cortar el ciclo While

    return False

    al final del try . Osea antes del except

    Para que no se haga infinito su ciclo.

    Alex Guaman

    Alex Guaman

    student•
    hace 4 años

    Reto:

    def divisor(num): divisors = [] if num < 0: raise ValueError('Debes ingresar un numeo positivo') for i in range(1, num + 1): if num % i == 0: divisors.append(i) return divisors def run(): try: num = int(input('Ingresa un numero: ')) try: print(divisor(num)) except ValueError as e: print(e) except ValueError: print('Debes ingresar un numero') if __name__ == '__main__': run()
    Mauricio Gonzalo Aliendre Pérez

    Mauricio Gonzalo Aliendre Pérez

    student•
    hace 4 años

    Solución al reto El bucle me permite no salir del programa hasta que ingrese un numero entero positivo

    def divisors(num): try: if num < 0: raise ValueError("Debes ingresar un numero positivo") if num == 0: raise ValueError("Debes ingresar un numero que no sea 0") divisors = [i for i in range(1, num+1) if num % i == 0] return divisors except ValueError as ve: print(ve) run() def run(): while True: try: num = int(input("Ingresa un numero: ")) print(divisors(num)) print("Termino mi programa") break except ValueError: print("Escribe un numero entero por favor") if __name__ == '__main__': run()
    Edgar Javier López Flores

    Edgar Javier López Flores

    student•
    hace 4 años

    Esta es mi solución al reto, añadí un bucle while para que se ejecutara hasta que el usuario ingresara un valor valido

    def divisors(num): try: if num < 0 or num == 0: raise ValueError("Ingresa un número positivo ó mayor que cero") divisors = [i for i in range(1, num + 1) if num % i == 0] return divisors except ValueError as ve: print(ve) run() def run(): while True: try: num = int(input("Ingresa un número: ")) print(divisors(num)) print("Termino mi programa") break except ValueError: print("Debes ingresar un número") if __name__ == '__main__': run()

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads