A core tenet of Python is that "it's easier to ask for forgiveness than permission":
Booleans are used in a variety of (popular) Python libraries when checking whether a password is correct (e.g. Django's `check_password` returns False if the password is wrong).
def handle_login():
try:
ph.verify(hash, "s3kr3tp4ssw0rd")
log_login()
redirect_to_page()
except VerificationError:
log_bad_login()
redirect_to_login() def handle_login():
try:
ph.verify(hash, "s3kr3tp4ssw0rd")
except VerificationError:
log_bad_login()
redirect_to_login()
else:
log_login()
redirect_to_page()
It's not a big deal for this code, but in general this is good practice because1. It makes it very obvious to the next developer which line is the one that is expected to raise that exception
2. One of the other lines could unintentionally raise that exception and mistakenly trigger the except clause. (This is more of an issue with Python's built in exceptions than with something very specific like this `VerificationError` example.)