import random
from functools import wraps
class GreetingError(Exception):
def __init__(self, message):
super().__init__(message)
class EmptyNameError(GreetingError):
def __init__(self):
super().__init__("Name is required.")
def greeting_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
name = args[0]
if not name.strip():
raise EmptyNameError()
# New set of unique greetings
greetings = [
"Top of the morning to ya",
"Greetings and salutations",
"Hello there, fellow traveler",
"What's poppin'",
"Hail and well met",
"Yo, yo, yo",
"Good morrow",
"Hey sunshine",
"Long time, no see",
"Sup"
]
message = random.choice(greetings)
result = func(name, message, **kwargs)
if not isinstance(result, str):
raise GreetingError("Greeting message must be a string.")
return result
except (EmptyNameError, GreetingError) as e:
return str(e)
except Exception as e:
return f"An unexpected error occurred: {e}"
return wrapper
def uppercase_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if isinstance(result, str):
return result.upper()
return result
return wrapper
@greeting_decorator
@uppercase_decorator
def generate_greeting(name, message):
punctuation = random.choice(["!", ".", "!!", "?!"])
return f"{message}, {name}{punctuation}"
def main():
try:
user_name = input("Enter your name (type 'exit' to quit): ")
if user_name.lower() == 'exit':
raise SystemExit("Exiting program...")
result = generate_greeting(user_name)
print(result)
except SystemExit as sys_exit:
print(sys_exit)
if __name__ == "__main__":
main()