On 28Jun2019 12:17, Cecil Westerhof <ce...@decebal.nl> wrote:
Chris Angelico <ros...@gmail.com> writes:
On Fri, Jun 28, 2019 at 7:33 PM Cecil Westerhof <ce...@decebal.nl> wrote:
I have a tkinter program where I have a function generate_report
which
in a try block calls the function append_row. This function has also a
try block. When they get an exception they give message. But when
append_row has already given a message then generate_report should
not. To implement this I use the following class:
class AlreadyHandledException(Exception):
pass
Then in append_row I have:
except Exception as err:
messagebox.showerror(error_str,
error_append + '\n\n\n\n' + str(err))
raise AlreadyHandledException()
And in generate_report I have:
except Exception as err:
if type(err).__name__ != "AlreadyHandledException":
messagebox.showerror(error_str,
error_generate + '\n\n\n\n' + str(err))
progress.pack_forget()
Is this an acceptable way, or should I do it differently?
Well, first off, I would use two separate except clauses, rather than
a type check.
You are completely right.
But are you able to just NOT catch the exception inside
append_row? Let it be handled at the top level only.
I am giving different messages. I changed the top part to:
except AlreadyHandledException:
pass
except Exception as err:
messagebox.showerror(error_str, error_generate + '\n\n\n\n' + str(err))
progress.lower()
For contrast, another approach.
By catching AlreadyHandledException and just going "pass" you're
effectively swalling that exception. For your purpose, that works.
However, in a since, why raise an exception you _know_ you're going to
deliberately ignore?
What if you have append_row return a Boolean? True on success, False on
failure but situation handled (i.e. append_row has shown an error, or
whatever recovery you adopt). And keep the uncaught exceptions for the
_unhandled_ situation. The "exceptional" situation.
Example:
def append_row(...):
...
try:
...stuff...
except ExpectedExceptionHere as err:
messagebox.showerror(....)
...maybe some cleanup...
return False
...
return True
Then your generate_report code goes:
try:
appended = append_row(....)
except Exception as err:
messagebox.showerror(....)
else:
if appended:
hooray!
else:
unhappy, but continuing
avoiding a "do nothing" special except clause.
Cheers,
Cameron Simpson <c...@cskk.id.au>
--
https://mail.python.org/mailman/listinfo/python-list