Hi Adrian,
Pavel's advise is absolutely correct.
To make things more logically reasonable, I would say that you may think that functions that "directly address" some objects (i.e. .Window, .Page, etc.) perform an implicit verification at the same time. I.e. if the test code is like sys.process("aaa")... this means that process "aaa" must exist and if for some reason it does not exist then this is a problem that should be reported. The above approach is reasonable because: a) you may not write dosens of 'if' statements in the script code to check if this or that object exists; and b) if for some reason some object does not exist then the error will be posted to the test log and the problem will not be missed.
Alternatively, if some object may or may not exist at some time, then test code should use the Wait... version of the relevant function (i.e. .WaitProcess, .WaitWindow, etc.). Wait... functions do not post errors to the log if the object does not exist but return an empty object instead with the only .Exists property which is set to False. The code should analyse the value of the .Exists property and perform accordingly.
Hope this makes things somewhat more clear...