[Lazarus] How do Lazarus users handle exceptions in procedures which are running in data modules?

Hans-Peter Diettrich DrDiettrich1 at aol.com
Tue Mar 5 18:15:23 CET 2013


Frank Church schrieb:
> How do Lazarus users handle exceptions in procedures which are running
> in data modules?
> 
> A lot of the guides and examples demonstrate raising exceptions, which
> generally display dialogs to the user that an exception has occurred.

Sample code showing an error message is *not* useful in real life 
exception handling, because Application will do that for you and show 
the error message.

> But what is the best way to handle them if they occur inside data
> modules as they may not have a user interface, or are even not
> supposed to have any, but then somehow communicate the exception back
> to the user interface is required?

Exceptions are not intended for immediate handling. Instead an exception 
should be handled in a place where it can be handled in a *meaningful* 
way, somewhere up in the call stack. Only if you have a loop or a 
sequence of statements, which should continue even if something goes 
wrong in on statement or iteration, you catch exceptions there.

In a sequence of statements you have to enclose every error prone 
statement with an try-except block or, when the statement is a call, 
enclose the code in that subroutine. In the exception handler you can 
set variables to meaningful values, to keep the code following the 
try-except block working. This can obviously be done only in places 
where you know about the following statements, and how they should 
behave after an exception has occured.

In a loop you enclose the entire loop body with try-except, and issue a 
message like "in ... iteration #... failed due to ...", or whatever the 
user should know. You also can set a flag and report "some iterations 
failed..." after the loop.

Of course not all exceptions can be handled this way. Some may be fatal, 
others may be neglectable to some degree. Therefore only selected 
exceptions should be handled in an except block, i.e. those which do not 
prevent the following code from working. The unhandled exceptions can be 
handled in subroutines further up in the call stack, when such handling 
is possible there. This means that exceptions should have specific 
types, which can be recognized in different levels of application 
exception handling.

DoDi





More information about the Lazarus mailing list