I understood your problem, even i faced the same problem.
Where i used to store the results of OnError, OnPreExecute and OnPostExecute in SQL tables.
So whenever a task execution starts, first it will fire OnPreExecute then insert a record into to Package_Process_table then fire OnPostExecute to update the Package_Process_table.
In between if an error comes then it will fire OnPreExecute, OnError and OnPostExecute.
In such case, OnError i will update Package_Process_table with status as FAILED, OnPostExecute first i will check whether the status of package is STARTED or FAILED if it is FAILED then i dont update Package_Process_table on OnPostExecute.