Menu iconMenu icon
Programación en Python Desbloqueada para Principiantes

Capítulo 9: Manejo de Errores y Excepciones

9.3: Provocando Excepciones

En Python, las excepciones son eventos que pueden ocurrir cuando hay un error o una condición excepcional durante la ejecución de un programa. Estos pueden ser causados por una variedad de factores, como la entrada incorrecta o un evento inesperado. Como hemos visto antes, Python provoca excepciones automáticamente cuando encuentra un error. Sin embargo, también puedes provocar excepciones manualmente en tu código usando la instrucción raise. Esto es particularmente útil cuando quieres imponer ciertas condiciones o restricciones en tu programa, como verificar la entrada válida o asegurarte de que ciertos recursos estén disponibles antes de ejecutar un fragmento de código.

Para provocar una excepción, puedes usar la palabra clave raise seguida de la clase de excepción o una instancia de la clase de excepción que deseas provocar. Esto puede ser útil para proporcionar contexto adicional para el error, como especificar el tipo de error que ocurrió o proporcionar un mensaje personalizado al usuario. Al provocar excepciones en tu código, puedes mejorar su solidez y hacerlo más confiable, asegurando que pueda manejar una amplia gama de entradas y condiciones.

Aquí está la sintaxis básica para provocar una excepción:

raise ExceptionClass("Error message")

Por ejemplo, puedes provocar una excepción ValueError si deseas forzar que un cierto valor esté dentro de un rango específico:

def validate_age(age):
    if age < 0 or age > 150:
        raise ValueError("Invalid age: Age must be between 0 and 150")

try:
    validate_age(-5)
except ValueError as ve:
    print(ve)

En este ejemplo, la función validate_age verifica si la edad dada está dentro del rango válido (0 a 150). Si no lo está, se provoca una excepción ValueError con un mensaje de error personalizado. Luego usamos un bloque try-except para llamar a la función y manejar la excepción si ocurre.

Cuando provocas una excepción en tu código, esencialmente estás indicando que algo ha salido mal y que el flujo normal de tu programa no puede continuar. Esto significa que el control se transfiere al bloque try-except más cercano, que es un bloque de código diseñado para manejar excepciones de una manera específica. Si no hay tal bloque, el programa finalizará y se mostrará el mensaje de error.

Pero, ¿por qué es tan importante provocar excepciones en primer lugar? Bueno, hacerlo realmente puede ayudarte a crear código más robusto y resistente a errores. Al detectar y manejar errores al principio del código, puedes evitar que causen un comportamiento inesperado o incluso que bloqueen tu programa por completo. Esto puede ahorrarte tiempo y frustración a largo plazo, así como hacer que tu código sea más confiable y fácil de mantener.

Ejercicio 9.3.1: Provocando excepciones para entrada inválida

Título: Validar entrada de usuario

Descripción: Escriba una función llamada validate_input que tome una cadena como entrada y provoque una excepción ValueError si la cadena de entrada contiene algún carácter especial (por ejemplo, !, @, #, etc.).

Instrucciones:

  1. Cree una función validate_input que tome una cadena input_str.
  2. Verifique si la cadena de entrada contiene caracteres especiales.
  3. Si los contiene, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con entradas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_input(input_str):
    if any(char in string.punctuation for char in input_str):
        raise ValueError("Invalid input: The input should not contain special characters")

try:
    validate_input("HelloWorld!")
except ValueError as ve:
    print(ve)

try:
    validate_input("HelloWorld")
except ValueError as ve:
    print(ve)

Salida:

Invalid input: The input should not contain special characters

Ejercicio 9.3.2: Provocando excepciones para contraseñas inválidas

Título: Verificador de robustez de contraseñas

Descripción: Cree una función llamada validate_password que verifique si una contraseña dada es robusta. Una contraseña robusta se define como aquella que tiene al menos 8 caracteres, contiene al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial. Provoque una excepción ValueError si la contraseña no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_password que tome una cadena password.
  2. Verifique si la contraseña cumple con los criterios de una contraseña robusta.
  3. Si no los cumple, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con contraseñas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_password(password):
    if len(password) < 8:
        raise ValueError("Invalid password: Password must have at least 8 characters")

    if not any(char.isupper() for char in password):
        raise ValueError("Invalid password: Password must have at least one uppercase letter")

    if not any(char.islower() for char in password):
        raise ValueError("Invalid password: Password must have at least one lowercase letter")

    if not any(char.isdigit() for char in password):
        raise ValueError("Invalid password: Password must have at least one digit")

    if not any(char in string.punctuation for char in password):
        raise ValueError("Invalid password: Password must have at least one special character")

try:
    validate_password("WeakPwd1")
except ValueError as ve:
    print(ve)

try:
    validate_password("StrongPwd1!")
except ValueError as ve:
    print(ve)

Salida:

Invalid password: Password must have at least one special character

Ejercicio 9.3.3: Provocando excepciones para direcciones de correo electrónico inválidas

Título: Validador de correo electrónico

Descripción: Cree una función llamada validate_email que verifique si una dirección de correo electrónico dada es válida. Una dirección de correo electrónico válida debe tener el siguiente formato: <nombre de usuario>@<dominio>.<tld>. Provoque una excepción ValueError si la dirección de correo electrónico no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_email que tome una cadena email.
  2. Verifique si la dirección de correo electrónico es válida.
  3. Si no lo es, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con direcciones de correo electrónico válidas e inválidas usando un bloque try-except.

Solución:

import re

def validate_email(email):
    email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    if not re.match(email_regex, email):
        raise ValueError("Invalid email address")

try:
    validate_email("invalid_email.com")
except ValueError as ve:
    print(ve)

try:
    validate_email("valid.email@example.com")
except ValueError as ve:
    print(ve)

Salida:

Invalid email address

9.3: Provocando Excepciones

En Python, las excepciones son eventos que pueden ocurrir cuando hay un error o una condición excepcional durante la ejecución de un programa. Estos pueden ser causados por una variedad de factores, como la entrada incorrecta o un evento inesperado. Como hemos visto antes, Python provoca excepciones automáticamente cuando encuentra un error. Sin embargo, también puedes provocar excepciones manualmente en tu código usando la instrucción raise. Esto es particularmente útil cuando quieres imponer ciertas condiciones o restricciones en tu programa, como verificar la entrada válida o asegurarte de que ciertos recursos estén disponibles antes de ejecutar un fragmento de código.

Para provocar una excepción, puedes usar la palabra clave raise seguida de la clase de excepción o una instancia de la clase de excepción que deseas provocar. Esto puede ser útil para proporcionar contexto adicional para el error, como especificar el tipo de error que ocurrió o proporcionar un mensaje personalizado al usuario. Al provocar excepciones en tu código, puedes mejorar su solidez y hacerlo más confiable, asegurando que pueda manejar una amplia gama de entradas y condiciones.

Aquí está la sintaxis básica para provocar una excepción:

raise ExceptionClass("Error message")

Por ejemplo, puedes provocar una excepción ValueError si deseas forzar que un cierto valor esté dentro de un rango específico:

def validate_age(age):
    if age < 0 or age > 150:
        raise ValueError("Invalid age: Age must be between 0 and 150")

try:
    validate_age(-5)
except ValueError as ve:
    print(ve)

En este ejemplo, la función validate_age verifica si la edad dada está dentro del rango válido (0 a 150). Si no lo está, se provoca una excepción ValueError con un mensaje de error personalizado. Luego usamos un bloque try-except para llamar a la función y manejar la excepción si ocurre.

Cuando provocas una excepción en tu código, esencialmente estás indicando que algo ha salido mal y que el flujo normal de tu programa no puede continuar. Esto significa que el control se transfiere al bloque try-except más cercano, que es un bloque de código diseñado para manejar excepciones de una manera específica. Si no hay tal bloque, el programa finalizará y se mostrará el mensaje de error.

Pero, ¿por qué es tan importante provocar excepciones en primer lugar? Bueno, hacerlo realmente puede ayudarte a crear código más robusto y resistente a errores. Al detectar y manejar errores al principio del código, puedes evitar que causen un comportamiento inesperado o incluso que bloqueen tu programa por completo. Esto puede ahorrarte tiempo y frustración a largo plazo, así como hacer que tu código sea más confiable y fácil de mantener.

Ejercicio 9.3.1: Provocando excepciones para entrada inválida

Título: Validar entrada de usuario

Descripción: Escriba una función llamada validate_input que tome una cadena como entrada y provoque una excepción ValueError si la cadena de entrada contiene algún carácter especial (por ejemplo, !, @, #, etc.).

Instrucciones:

  1. Cree una función validate_input que tome una cadena input_str.
  2. Verifique si la cadena de entrada contiene caracteres especiales.
  3. Si los contiene, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con entradas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_input(input_str):
    if any(char in string.punctuation for char in input_str):
        raise ValueError("Invalid input: The input should not contain special characters")

try:
    validate_input("HelloWorld!")
except ValueError as ve:
    print(ve)

try:
    validate_input("HelloWorld")
except ValueError as ve:
    print(ve)

Salida:

Invalid input: The input should not contain special characters

Ejercicio 9.3.2: Provocando excepciones para contraseñas inválidas

Título: Verificador de robustez de contraseñas

Descripción: Cree una función llamada validate_password que verifique si una contraseña dada es robusta. Una contraseña robusta se define como aquella que tiene al menos 8 caracteres, contiene al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial. Provoque una excepción ValueError si la contraseña no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_password que tome una cadena password.
  2. Verifique si la contraseña cumple con los criterios de una contraseña robusta.
  3. Si no los cumple, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con contraseñas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_password(password):
    if len(password) < 8:
        raise ValueError("Invalid password: Password must have at least 8 characters")

    if not any(char.isupper() for char in password):
        raise ValueError("Invalid password: Password must have at least one uppercase letter")

    if not any(char.islower() for char in password):
        raise ValueError("Invalid password: Password must have at least one lowercase letter")

    if not any(char.isdigit() for char in password):
        raise ValueError("Invalid password: Password must have at least one digit")

    if not any(char in string.punctuation for char in password):
        raise ValueError("Invalid password: Password must have at least one special character")

try:
    validate_password("WeakPwd1")
except ValueError as ve:
    print(ve)

try:
    validate_password("StrongPwd1!")
except ValueError as ve:
    print(ve)

Salida:

Invalid password: Password must have at least one special character

Ejercicio 9.3.3: Provocando excepciones para direcciones de correo electrónico inválidas

Título: Validador de correo electrónico

Descripción: Cree una función llamada validate_email que verifique si una dirección de correo electrónico dada es válida. Una dirección de correo electrónico válida debe tener el siguiente formato: <nombre de usuario>@<dominio>.<tld>. Provoque una excepción ValueError si la dirección de correo electrónico no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_email que tome una cadena email.
  2. Verifique si la dirección de correo electrónico es válida.
  3. Si no lo es, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con direcciones de correo electrónico válidas e inválidas usando un bloque try-except.

Solución:

import re

def validate_email(email):
    email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    if not re.match(email_regex, email):
        raise ValueError("Invalid email address")

try:
    validate_email("invalid_email.com")
except ValueError as ve:
    print(ve)

try:
    validate_email("valid.email@example.com")
except ValueError as ve:
    print(ve)

Salida:

Invalid email address

9.3: Provocando Excepciones

En Python, las excepciones son eventos que pueden ocurrir cuando hay un error o una condición excepcional durante la ejecución de un programa. Estos pueden ser causados por una variedad de factores, como la entrada incorrecta o un evento inesperado. Como hemos visto antes, Python provoca excepciones automáticamente cuando encuentra un error. Sin embargo, también puedes provocar excepciones manualmente en tu código usando la instrucción raise. Esto es particularmente útil cuando quieres imponer ciertas condiciones o restricciones en tu programa, como verificar la entrada válida o asegurarte de que ciertos recursos estén disponibles antes de ejecutar un fragmento de código.

Para provocar una excepción, puedes usar la palabra clave raise seguida de la clase de excepción o una instancia de la clase de excepción que deseas provocar. Esto puede ser útil para proporcionar contexto adicional para el error, como especificar el tipo de error que ocurrió o proporcionar un mensaje personalizado al usuario. Al provocar excepciones en tu código, puedes mejorar su solidez y hacerlo más confiable, asegurando que pueda manejar una amplia gama de entradas y condiciones.

Aquí está la sintaxis básica para provocar una excepción:

raise ExceptionClass("Error message")

Por ejemplo, puedes provocar una excepción ValueError si deseas forzar que un cierto valor esté dentro de un rango específico:

def validate_age(age):
    if age < 0 or age > 150:
        raise ValueError("Invalid age: Age must be between 0 and 150")

try:
    validate_age(-5)
except ValueError as ve:
    print(ve)

En este ejemplo, la función validate_age verifica si la edad dada está dentro del rango válido (0 a 150). Si no lo está, se provoca una excepción ValueError con un mensaje de error personalizado. Luego usamos un bloque try-except para llamar a la función y manejar la excepción si ocurre.

Cuando provocas una excepción en tu código, esencialmente estás indicando que algo ha salido mal y que el flujo normal de tu programa no puede continuar. Esto significa que el control se transfiere al bloque try-except más cercano, que es un bloque de código diseñado para manejar excepciones de una manera específica. Si no hay tal bloque, el programa finalizará y se mostrará el mensaje de error.

Pero, ¿por qué es tan importante provocar excepciones en primer lugar? Bueno, hacerlo realmente puede ayudarte a crear código más robusto y resistente a errores. Al detectar y manejar errores al principio del código, puedes evitar que causen un comportamiento inesperado o incluso que bloqueen tu programa por completo. Esto puede ahorrarte tiempo y frustración a largo plazo, así como hacer que tu código sea más confiable y fácil de mantener.

Ejercicio 9.3.1: Provocando excepciones para entrada inválida

Título: Validar entrada de usuario

Descripción: Escriba una función llamada validate_input que tome una cadena como entrada y provoque una excepción ValueError si la cadena de entrada contiene algún carácter especial (por ejemplo, !, @, #, etc.).

Instrucciones:

  1. Cree una función validate_input que tome una cadena input_str.
  2. Verifique si la cadena de entrada contiene caracteres especiales.
  3. Si los contiene, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con entradas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_input(input_str):
    if any(char in string.punctuation for char in input_str):
        raise ValueError("Invalid input: The input should not contain special characters")

try:
    validate_input("HelloWorld!")
except ValueError as ve:
    print(ve)

try:
    validate_input("HelloWorld")
except ValueError as ve:
    print(ve)

Salida:

Invalid input: The input should not contain special characters

Ejercicio 9.3.2: Provocando excepciones para contraseñas inválidas

Título: Verificador de robustez de contraseñas

Descripción: Cree una función llamada validate_password que verifique si una contraseña dada es robusta. Una contraseña robusta se define como aquella que tiene al menos 8 caracteres, contiene al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial. Provoque una excepción ValueError si la contraseña no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_password que tome una cadena password.
  2. Verifique si la contraseña cumple con los criterios de una contraseña robusta.
  3. Si no los cumple, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con contraseñas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_password(password):
    if len(password) < 8:
        raise ValueError("Invalid password: Password must have at least 8 characters")

    if not any(char.isupper() for char in password):
        raise ValueError("Invalid password: Password must have at least one uppercase letter")

    if not any(char.islower() for char in password):
        raise ValueError("Invalid password: Password must have at least one lowercase letter")

    if not any(char.isdigit() for char in password):
        raise ValueError("Invalid password: Password must have at least one digit")

    if not any(char in string.punctuation for char in password):
        raise ValueError("Invalid password: Password must have at least one special character")

try:
    validate_password("WeakPwd1")
except ValueError as ve:
    print(ve)

try:
    validate_password("StrongPwd1!")
except ValueError as ve:
    print(ve)

Salida:

Invalid password: Password must have at least one special character

Ejercicio 9.3.3: Provocando excepciones para direcciones de correo electrónico inválidas

Título: Validador de correo electrónico

Descripción: Cree una función llamada validate_email que verifique si una dirección de correo electrónico dada es válida. Una dirección de correo electrónico válida debe tener el siguiente formato: <nombre de usuario>@<dominio>.<tld>. Provoque una excepción ValueError si la dirección de correo electrónico no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_email que tome una cadena email.
  2. Verifique si la dirección de correo electrónico es válida.
  3. Si no lo es, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con direcciones de correo electrónico válidas e inválidas usando un bloque try-except.

Solución:

import re

def validate_email(email):
    email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    if not re.match(email_regex, email):
        raise ValueError("Invalid email address")

try:
    validate_email("invalid_email.com")
except ValueError as ve:
    print(ve)

try:
    validate_email("valid.email@example.com")
except ValueError as ve:
    print(ve)

Salida:

Invalid email address

9.3: Provocando Excepciones

En Python, las excepciones son eventos que pueden ocurrir cuando hay un error o una condición excepcional durante la ejecución de un programa. Estos pueden ser causados por una variedad de factores, como la entrada incorrecta o un evento inesperado. Como hemos visto antes, Python provoca excepciones automáticamente cuando encuentra un error. Sin embargo, también puedes provocar excepciones manualmente en tu código usando la instrucción raise. Esto es particularmente útil cuando quieres imponer ciertas condiciones o restricciones en tu programa, como verificar la entrada válida o asegurarte de que ciertos recursos estén disponibles antes de ejecutar un fragmento de código.

Para provocar una excepción, puedes usar la palabra clave raise seguida de la clase de excepción o una instancia de la clase de excepción que deseas provocar. Esto puede ser útil para proporcionar contexto adicional para el error, como especificar el tipo de error que ocurrió o proporcionar un mensaje personalizado al usuario. Al provocar excepciones en tu código, puedes mejorar su solidez y hacerlo más confiable, asegurando que pueda manejar una amplia gama de entradas y condiciones.

Aquí está la sintaxis básica para provocar una excepción:

raise ExceptionClass("Error message")

Por ejemplo, puedes provocar una excepción ValueError si deseas forzar que un cierto valor esté dentro de un rango específico:

def validate_age(age):
    if age < 0 or age > 150:
        raise ValueError("Invalid age: Age must be between 0 and 150")

try:
    validate_age(-5)
except ValueError as ve:
    print(ve)

En este ejemplo, la función validate_age verifica si la edad dada está dentro del rango válido (0 a 150). Si no lo está, se provoca una excepción ValueError con un mensaje de error personalizado. Luego usamos un bloque try-except para llamar a la función y manejar la excepción si ocurre.

Cuando provocas una excepción en tu código, esencialmente estás indicando que algo ha salido mal y que el flujo normal de tu programa no puede continuar. Esto significa que el control se transfiere al bloque try-except más cercano, que es un bloque de código diseñado para manejar excepciones de una manera específica. Si no hay tal bloque, el programa finalizará y se mostrará el mensaje de error.

Pero, ¿por qué es tan importante provocar excepciones en primer lugar? Bueno, hacerlo realmente puede ayudarte a crear código más robusto y resistente a errores. Al detectar y manejar errores al principio del código, puedes evitar que causen un comportamiento inesperado o incluso que bloqueen tu programa por completo. Esto puede ahorrarte tiempo y frustración a largo plazo, así como hacer que tu código sea más confiable y fácil de mantener.

Ejercicio 9.3.1: Provocando excepciones para entrada inválida

Título: Validar entrada de usuario

Descripción: Escriba una función llamada validate_input que tome una cadena como entrada y provoque una excepción ValueError si la cadena de entrada contiene algún carácter especial (por ejemplo, !, @, #, etc.).

Instrucciones:

  1. Cree una función validate_input que tome una cadena input_str.
  2. Verifique si la cadena de entrada contiene caracteres especiales.
  3. Si los contiene, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con entradas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_input(input_str):
    if any(char in string.punctuation for char in input_str):
        raise ValueError("Invalid input: The input should not contain special characters")

try:
    validate_input("HelloWorld!")
except ValueError as ve:
    print(ve)

try:
    validate_input("HelloWorld")
except ValueError as ve:
    print(ve)

Salida:

Invalid input: The input should not contain special characters

Ejercicio 9.3.2: Provocando excepciones para contraseñas inválidas

Título: Verificador de robustez de contraseñas

Descripción: Cree una función llamada validate_password que verifique si una contraseña dada es robusta. Una contraseña robusta se define como aquella que tiene al menos 8 caracteres, contiene al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial. Provoque una excepción ValueError si la contraseña no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_password que tome una cadena password.
  2. Verifique si la contraseña cumple con los criterios de una contraseña robusta.
  3. Si no los cumple, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con contraseñas válidas e inválidas usando un bloque try-except.

Solución:

import string

def validate_password(password):
    if len(password) < 8:
        raise ValueError("Invalid password: Password must have at least 8 characters")

    if not any(char.isupper() for char in password):
        raise ValueError("Invalid password: Password must have at least one uppercase letter")

    if not any(char.islower() for char in password):
        raise ValueError("Invalid password: Password must have at least one lowercase letter")

    if not any(char.isdigit() for char in password):
        raise ValueError("Invalid password: Password must have at least one digit")

    if not any(char in string.punctuation for char in password):
        raise ValueError("Invalid password: Password must have at least one special character")

try:
    validate_password("WeakPwd1")
except ValueError as ve:
    print(ve)

try:
    validate_password("StrongPwd1!")
except ValueError as ve:
    print(ve)

Salida:

Invalid password: Password must have at least one special character

Ejercicio 9.3.3: Provocando excepciones para direcciones de correo electrónico inválidas

Título: Validador de correo electrónico

Descripción: Cree una función llamada validate_email que verifique si una dirección de correo electrónico dada es válida. Una dirección de correo electrónico válida debe tener el siguiente formato: <nombre de usuario>@<dominio>.<tld>. Provoque una excepción ValueError si la dirección de correo electrónico no cumple con estos criterios.

Instrucciones:

  1. Cree una función validate_email que tome una cadena email.
  2. Verifique si la dirección de correo electrónico es válida.
  3. Si no lo es, provoque una ValueError con un mensaje de error personalizado.
  4. Pruebe la función con direcciones de correo electrónico válidas e inválidas usando un bloque try-except.

Solución:

import re

def validate_email(email):
    email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    if not re.match(email_regex, email):
        raise ValueError("Invalid email address")

try:
    validate_email("invalid_email.com")
except ValueError as ve:
    print(ve)

try:
    validate_email("valid.email@example.com")
except ValueError as ve:
    print(ve)

Salida:

Invalid email address