Is “exception” rare?

An “exception” is usually defined as “something that does not conform to the norm,” and is therefore somewhat rare. There is nothing rare about exceptions in Python. They are everywhere. Virtually every module in the standard Python library uses them, and Python itself will raise them in many different circumstances.

If you know that a line of code might raise an exception when executed, you should handle the exception. In a well-written program, unhandled exceptions should be the exception.

7.1 Handling Exceptions

What is the function that has be generalized to ask for any type of input?

def readVal(valType, requestMsg, errorMsg): 
    while True:
        val = input(requestMsg + ' ')
        try:
            return(valType(val)) #convert str to valType before returning
        except ValueError:
            print(val, errorMsg)
            
readVal(int, 'Enter an integer:', 'is not an integer')

7.2 Exceptions as a Control Flow Mechanism

What is the difference in dealing with function with “error” in different programming language?

In many programming languages, the standard approach to dealing with er- rors is to have functions return a value (often something analogous to Python’s None) indicating that something has gone amiss. Each function invocation has to check whether that value has been returned. In Python, it is more usual to have a function raise an exception when it cannot produce a result that is consistent with the function’s specification.

What is the except: block used for?

In principle, the second except block should never be entered, because the code invoking getRatios should respect the assumptions in the specification of getRatios. However, since checking these assumptions imposes only an insignificant computational burden, it is probably worth practicing defensive programming and checking anyway.

How is raise and except used?

def getRatios(vect1, vect2):
    """ Assumes: vect1 and vect2 are equal length lists of numbers
        Returns: a list containing the meaningful values of vect1[i]/vect2[i]"""
    ratios = []
    for index in range(len(vect1)):
        try:
            ratios.append(vect1[index]/vect2[index])
        except ZeroDivisionError:
            ratios.append(float('nan')) #nan = Not a Number
        except:
            raise ValueError('getRatios called with bad arguments')
    return ratios
[1.0, 1.0, nan, 2.0]
[]
getRatios called with bad arguments
def getGrades(fname):
    try:
        gradesFile = open(fname, 'r') #open file for reading
    except IOError:
        raise ValueError('getGrades could not open ' + fname)
    grades = []
    for line in gradesFile:
        try:
            grades.append(float(line))
        except:
            raise ValueError('Unable to convert line to float')
    return grades
try:
    grades = getGrades('quiz1grades.txt')
    grades.sort()
    median = grades[len(grades)//2]
    print('Median grade is', median)
except ValueError as errorMsg:
    print('Whoops.', errorMsg)

7.3 Assertions

What are assert statement used for?

Assertions are a useful defensive programming tool. They can be used to confirm that the arguments to a function are of appropriate types.

They are also a useful debugging tool. The can be used, for example, to confirm that intermediate values have the expected values or that a function returns an acceptable value.

LS0tCnRpdGxlOiAwNyBFWENFUFRJT05TIEFORCBBU1NFUlRJT05TCnN1YnRpdGxlOiAKYXV0aG9yOiDmm7LmlL8KZGF0ZTogMjAyMC0wNS0yOQpzbHVnOiBleGNlcHRpb25zLWFuZC1hc3NlcnRpb25zCnRhZ3M6Ci0gCmNhdGVnb3JpZXM6Ci0gbWl0NjAwMAotIElDUFAgYm9va25vdGVzCnR5cG9yYS1yb290LXVybDogLi4vLi4vc3RhdGljCnNob3dfdG9jOiB5ZXMKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIElzICJleGNlcHRpb24iIHJhcmU/CgpBbiDigJxleGNlcHRpb27igJ0gaXMgdXN1YWxseSBkZWZpbmVkIGFzIOKAnHNvbWV0aGluZyB0aGF0IGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIG5vcm0s4oCdIGFuZCBpcyB0aGVyZWZvcmUgc29tZXdoYXQgcmFyZS4gVGhlcmUgaXMgbm90aGluZyByYXJlIGFib3V0IGV4Y2VwdGlvbnMgaW4gUHl0aG9uLiBUaGV5IGFyZSBldmVyeXdoZXJlLiBWaXJ0dWFsbHkgZXZlcnkgbW9kdWxlIGluIHRoZSBzdGFuZGFyZCBQeXRob24gbGlicmFyeSB1c2VzIHRoZW0sIGFuZCBQeXRob24gaXRzZWxmIHdpbGwgcmFpc2UgdGhlbSBpbiBtYW55IGRpZmZlcmVudCBjaXJjdW1zdGFuY2VzLiAKCklmIHlvdSBrbm93IHRoYXQgYSBsaW5lIG9mIGNvZGUgbWlnaHQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gZXhlY3V0ZWQsIHlvdSBzaG91bGQgaGFuZGxlIHRoZSBleGNlcHRpb24uIEluIGEgd2VsbC13cml0dGVuIHByb2dyYW0sIHVuaGFuZGxlZCBleGNlcHRpb25zIHNob3VsZCBiZSB0aGUgZXhjZXB0aW9uLgoKIyMgNy4xIEhhbmRsaW5nIEV4Y2VwdGlvbnMKCiMjIyBXaGF0IGlzIHRoZSBmdW5jdGlvbiB0aGF0IGhhcyBiZSBnZW5lcmFsaXplZCB0byBhc2sgZm9yIGFueSB0eXBlIG9mIGlucHV0PwoKYGBgcHl0aG9uCmRlZiByZWFkVmFsKHZhbFR5cGUsIHJlcXVlc3RNc2csIGVycm9yTXNnKTogCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHZhbCA9IGlucHV0KHJlcXVlc3RNc2cgKyAnICcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4odmFsVHlwZSh2YWwpKSAjY29udmVydCBzdHIgdG8gdmFsVHlwZSBiZWZvcmUgcmV0dXJuaW5nCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHByaW50KHZhbCwgZXJyb3JNc2cpCiAgICAgICAgICAgIApyZWFkVmFsKGludCwgJ0VudGVyIGFuIGludGVnZXI6JywgJ2lzIG5vdCBhbiBpbnRlZ2VyJykKYGBgCgojIyA3LjIgRXhjZXB0aW9ucyBhcyBhIENvbnRyb2wgRmxvdyBNZWNoYW5pc20KCiMjIyBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGluIGRlYWxpbmcgd2l0aCBmdW5jdGlvbiB3aXRoICJlcnJvciIgaW4gZGlmZmVyZW50IHByb2dyYW1taW5nIGxhbmd1YWdlPyAKCkluIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCB0aGUgc3RhbmRhcmQgYXBwcm9hY2ggdG8gZGVhbGluZyB3aXRoIGVyLSByb3JzIGlzIHRvIGhhdmUgZnVuY3Rpb25zIHJldHVybiBhIHZhbHVlIChvZnRlbiBzb21ldGhpbmcgYW5hbG9nb3VzIHRvIFB5dGhvbuKAmXMgTm9uZSkgaW5kaWNhdGluZyB0aGF0IHNvbWV0aGluZyBoYXMgZ29uZSBhbWlzcy4gRWFjaCBmdW5jdGlvbiBpbnZvY2F0aW9uIGhhcyB0byBjaGVjayB3aGV0aGVyIHRoYXQgdmFsdWUgaGFzIGJlZW4gcmV0dXJuZWQuIEluIFB5dGhvbiwgaXQgaXMgbW9yZSB1c3VhbCB0byBoYXZlIGEgZnVuY3Rpb24gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IHByb2R1Y2UgYSByZXN1bHQgdGhhdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bmN0aW9u4oCZcyBzcGVjaWZpY2F0aW9uLgoKIyMjIFdoYXQgaXMgdGhlIGBleGNlcHQ6YCBibG9jayB1c2VkIGZvcj8KCkluIHByaW5jaXBsZSwgdGhlIHNlY29uZCBleGNlcHQgYmxvY2sgc2hvdWxkIG5ldmVyIGJlIGVudGVyZWQsIGJlY2F1c2UgdGhlIGNvZGUgaW52b2tpbmcgZ2V0UmF0aW9zIHNob3VsZCByZXNwZWN0IHRoZSBhc3N1bXB0aW9ucyBpbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBnZXRSYXRpb3MuIEhvd2V2ZXIsIHNpbmNlIGNoZWNraW5nIHRoZXNlIGFzc3VtcHRpb25zIGltcG9zZXMgb25seSBhbiBpbnNpZ25pZmljYW50IGNvbXB1dGF0aW9uYWwgYnVyZGVuLCBpdCBpcyBwcm9iYWJseSB3b3J0aCBwcmFjdGljaW5nIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBhbmQgY2hlY2tpbmcgYW55d2F5LgoKIyMjIEhvdyBpcyBgcmFpc2VgIGFuZCBgZXhjZXB0YCB1c2VkPwoKYGBge3B5dGhvbn0KZGVmIGdldFJhdGlvcyh2ZWN0MSwgdmVjdDIpOgogICAgIiIiIEFzc3VtZXM6IHZlY3QxIGFuZCB2ZWN0MiBhcmUgZXF1YWwgbGVuZ3RoIGxpc3RzIG9mIG51bWJlcnMKICAgICAgICBSZXR1cm5zOiBhIGxpc3QgY29udGFpbmluZyB0aGUgbWVhbmluZ2Z1bCB2YWx1ZXMgb2YgdmVjdDFbaV0vdmVjdDJbaV0iIiIKICAgIHJhdGlvcyA9IFtdCiAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKHZlY3QxKSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByYXRpb3MuYXBwZW5kKHZlY3QxW2luZGV4XS92ZWN0MltpbmRleF0pCiAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgogICAgICAgICAgICByYXRpb3MuYXBwZW5kKGZsb2F0KCduYW4nKSkgI25hbiA9IE5vdCBhIE51bWJlcgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZ2V0UmF0aW9zIGNhbGxlZCB3aXRoIGJhZCBhcmd1bWVudHMnKQogICAgcmV0dXJuIHJhdGlvcwpgYGAKCmBgYHtweXRob259CnRyeToKICAgIHByaW50KGdldFJhdGlvcyhbMS4wLDIuMCw3LjAsNi4wXSwgWzEuMCwyLjAsMC4wLDMuMF0pKSAgICAgCiAgICBwcmludChnZXRSYXRpb3MoW10sIFtdKSkKICAgIHByaW50KGdldFJhdGlvcyhbMS4wLCAyLjBdLCBbMy4wXSkpCmV4Y2VwdCBWYWx1ZUVycm9yIGFzIG1zZzogcHJpbnQobXNnKQpgYGAKCmBgYHtweXRob259CmRlZiBnZXRHcmFkZXMoZm5hbWUpOgogICAgdHJ5OgogICAgICAgIGdyYWRlc0ZpbGUgPSBvcGVuKGZuYW1lLCAncicpICNvcGVuIGZpbGUgZm9yIHJlYWRpbmcKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2dldEdyYWRlcyBjb3VsZCBub3Qgb3BlbiAnICsgZm5hbWUpCiAgICBncmFkZXMgPSBbXQogICAgZm9yIGxpbmUgaW4gZ3JhZGVzRmlsZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGdyYWRlcy5hcHBlbmQoZmxvYXQobGluZSkpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCBsaW5lIHRvIGZsb2F0JykKICAgIHJldHVybiBncmFkZXMKYGBgCgpgYGB7cHl0aG9ufQp0cnk6CiAgICBncmFkZXMgPSBnZXRHcmFkZXMoJ3F1aXoxZ3JhZGVzLnR4dCcpCiAgICBncmFkZXMuc29ydCgpCiAgICBtZWRpYW4gPSBncmFkZXNbbGVuKGdyYWRlcykvLzJdCiAgICBwcmludCgnTWVkaWFuIGdyYWRlIGlzJywgbWVkaWFuKQpleGNlcHQgVmFsdWVFcnJvciBhcyBlcnJvck1zZzoKICAgIHByaW50KCdXaG9vcHMuJywgZXJyb3JNc2cpCmBgYAoKIyMgNy4zIEFzc2VydGlvbnMKCiMjIyBXaGF0IGFyZSBgYXNzZXJ0YCAgc3RhdGVtZW50IHVzZWQgZm9yPwoKQXNzZXJ0aW9ucyBhcmUgYSB1c2VmdWwgZGVmZW5zaXZlIHByb2dyYW1taW5nIHRvb2wuIFRoZXkgY2FuIGJlIHVzZWQgdG8gY29uZmlybSB0aGF0IHRoZSBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiBhcmUgb2YgYXBwcm9wcmlhdGUgdHlwZXMuIAoKVGhleSBhcmUgYWxzbyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4gVGhlIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gY29uZmlybSB0aGF0IGludGVybWVkaWF0ZSB2YWx1ZXMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzIG9yIHRoYXQgYSBmdW5jdGlvbiByZXR1cm5zIGFuIGFjY2VwdGFibGUgdmFsdWUuCg==