Is there an idiomatic way to catch an exception when multiple methods may throw?:
try:
someMethod() # raises OSError
someOtherMethod() # raises OSError
except OSError:
handle()
The exception may or may not be caused by the same event internal to the helper functions, so in the current layout it seems impossible to discern which method threw the exception. To resolve, there are two cases I could implement.
The first case is wrapping each method in its own try/except
:
try:
someMethod()
except OSError:
handle()
try:
someOtherMethod()
except OSError:
handle()
While this address the issue of identifying which helper function threw the exception, it presents a new problem. If successive helper methods require successful of preceding methods, separate try/except
blocks lead to forced early returning as subsequent blocks should not be executed:
try:
someMethod()
except OSError:
handle()
return
try:
someOtherMethod()
except OSError:
handle()
This seems like a code-smell and is therefore undesired. The second case is creating custom exceptions based on the content of the internally generated exception:
class FailedReadIOError(Exception):
def __init__(self, msg):
super().__init__(msg)
class FailedFolderError(Exception):
def __init__(self, msg):
super().__init__(msg)
def someMethod():
try:
# stuff
except OSError as err:
raise FailedReadIOError('thrown in someMethod') from err
try:
# stuff
except OSError as err:
raise FailedFolderError('thrown in someMethod') from err
def someOtherMethod():
try:
# stuff
except OSError as err:
raise FailedReadIOError('thrown in someOtherMethod') from err
try:
someMethod()
someOtherMethod()
except FailedReadIOError:
handle_this()
except FailedFolderError:
handle_that()
This adequately addresses the concerns but requires additional (minimal) code to be written. Is there a pattern that achieves the same result without the need to create custom exceptions when multiple methods throw the same exception?
Aucun commentaire:
Enregistrer un commentaire