dave p. guandalino wrote:
Which of the following ways is better to handle something wrong? Many
thanks.

It depends on what you are trying to do.


# First:
def is_valid_project():
    # Do checks and valorize is_a_valid_project accordingly
    return is_a_valid_project # True / False

Do you mean "validate" rather than "valorize"?

# caller side
if is_valid_project():
    pass # do stuffs with valid project
else:
    print "error"

This is not the best approach. Never (well, *almost* never) use print for printing error messages. Here the caller should do one of these:

# caller #1
if is_valid_project():
    do_something_with_valid_project()
else:
    do_something_else()

# caller #2
if is_valid_project():
    do_something_with_valid_project()
else:
    # this is a fatal error, bail out
    raise SomeException()


This general technique is called "Look before you leap" -- you're checking whether something is safe before attempting to do it. If it is safe, you continue, otherwise you take an alternative action (often just to raise an error and stop processing).



# Second solution:
def is_valid_project():
    # Do checks and valorize is_a_valid_project accordingly
    if not is_a_valid_project:
        raise NotAValidProject

# caller side
try:
    is_valid_project()
    pass # do stuffs with valid project
except NotAValidProject:
    print "error"

This general technique is called "Easier to ask forgiveness than permission" -- just try to do what you want, and if it fails, catch the exception and do something else.

Again, you should almost never catch an exception just to print an error message. Very rare exception to this rule: at the *very top level* of an application, you might catch the exception, log the technical details, display a user-friendly message to the user, and then exit the application. When you use raise, Python does nearly all of this for you. It won't log the failure, and the message is a technical traceback aimed at programmers rather than end-users, but it prints an error message and exits the application.

Better would be:


# caller #3
is_valid_project()  # will raise an exception if there is a problem
do_something_with_valid_project()


# caller #4
try:
    is_valid_project()
except NotAValidProject:
    do_something_else
else:
    # no exception occurred
    do_something_with_valid_project()


In Python, try blocks are very efficient, but actually catching an exception is moderately costly. So the general rule is, if you expect most cases to succeed, and failures to be rare, it is better to use a try...except block and the "Easier to ask forgiveness" strategy. If you expect failures to be common, it is better to "Look Before You Leap".


--
Steven

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to