Two things about error handling:

The scope of an error trap like On Error Goto lies only within a sub or function.
To find out exactly where the error came up you would have to have traps in every function or sub and write something to log the relevant variables of this sub.
This is rather uncomfortable and also unpredictive because you never know in advance which data would be relevant for an error.

An optimal error handling largely depends on the programming you have done.
You have to set error traps at points where you KNOW an error could happen and also know WHAT KIND of error could happen there.
E.g. when attempting to read a file you would know a possible error is, the file does not exist.
So you could trap that exception within the reading sub.
(I admit this is no perfect example, because you better direct your programming such as you first verify file existence for attempting to read).