Note
Handling errors
Exception
A built-in mechanism in a programming language to declare and respond to exceptional conditions.
Exceptions can be handled by the program, preventing the interpreter from halting.Unhandled exceptions will cause Python to halt execution and print a stack trace.
Mastering exceptions
- Exceptions are objects ,which have classes with constructor.
- They enable non-local continuations of control:
- If f calls g and g calls h ,exceptions can shift control from h to f without waiting for g to return
Raising Exceptions
Assert Statements
Assert statement raise an exception of type AssertionError
__ assert <expression> , <string>__
Assertions are designed to be used liberally . They can be ignored to increase efficiency by running Python with the ‘-o’ flag. “o” stands for optimized.
Whether assertions are enabled is governed by a bool _debug_ ._debug_ is False in ‘python -o’ environment.
Raise Statements
raise <expression>
<expression> must evaluate to a subclass of BaseException or an instance of one.
Exceptions are constructed like any other object. E.g. raise TypeError(‘Bad argument’)
Try Statements
try:
# <try suite>
... this line always gets executed
... maybe this one too...
except <exception class> as <name>:
<except suite>
finally:
... this will alwayd run at the end
Execution rules
- The <try suite> is executed first.
- If, during the course of executing the <try suite> , an exception is raised that is not handled otherwise .
- If the class of the exception inherits from <exception class> ,then the <except suite> is executed ,with <name> bound to the exception
Exception handling can prevent a program from terminating
try:
x = 1/0
except ZeroDivisionError as e
print('handling a ', type(e))
x = 0
Multiple try statements: Control jumps to the except suite of the most recent try statement that handled that type of exception.
Example : reduce
from operator import add, mul, truediv
def divide_all(n, ds):
try:
return reduce(truediv, ds, n)
except ZeroDivisionError:
# python's infinite
return float('inf')
def reduce(f, s, initial):
""" combine elements of s using f starting with the value of initial
>>> reduce(mul,[2,4,8],1)
64
>>> reduce(add,[1,2,3,4],0)
10
"""
for x in s:
initial = f(initial,x)
return initial