У вас есть два основных варианта:
- Считайте
handle_exceptions
логическим значением и повторно поднимите, если False
- Считайте
handle_exceptions
исключениями для обработки
По логическому маршруту у вас есть два основных варианта:
def my_func(my_arg, handle_exceptions):
try:
do_something(my_arg)
except Exception, e:
if not handle_exceptions:
raise
print "my_func is handling the exception"
или
def my_func(my_arg, handle_exceptions):
if handle_exceptions:
exceptions = ValueError, IndexError # or whatever
else:
exceptions = NoExceptions # None in 2.x, or custom Exception class in 3.x
try:
do_something(my_arg)
except exceptions, e:
print "my_func is handling the exception"
Вдоль маршрута 'трактовать handle_exceptions
как исключения для обработки' вы можете сделать это:
class NoExceptions(Exception):
'Dummy exception, never raised'
def my_func(my_arg, handle_exceptions=NoExceptions):
try:
do_something(my_arg)
except handle_exceptions, e:
print "my_func is handling the exception"
и вы бы назвали это так:
my_func(some_arg, ValueError) # to handle ValueErrors
или
my_func(some_arg) # to not handle any exeptions
Это имеет то преимущество, что вызывающая сторона может указать, какие исключения обрабатываются. Если вы выберете этот последний маршрут, вам также может потребоваться указать обработчик исключений, возможно, что-то вроде этого:
def my_func(my_arg, handle_exceptions=NoExceptions, handler=None):
try:
do_something(my_arg)
except handle_exceptions, e:
if handler is not None:
handler(e)
else:
log_this_exception()