With uninstall custom actions you have to be really careful.
When working with uninstall custom actions, always encapsulate the custom action in a try / catch block!
If you are testing your uninstall process and it throws an exception you will be left with a half uninstalled application.
As the application has not un-installed you cannot install a new version and as the uninstaller is compiled you cannot rebuild the installer to fix the error that is causing the exception.
How do I know this?
I did this exact thing. I was creating an installer that had custom actions for both install and uninstall.
I caused an exception in the uninstall process and I was left with a product that could not be uninstalled!
Can you recover from this?
I found that in this scneario the Microsoft Fix-it tool is your saviour.
Download the fix it program from here, Microsoft Fix-it Uninstaller
Run the program and follow the prompts.
I did a custom uninstall, chose my product that had failed to uninstall and it cleans up all the relevant registry keys so that it has been completely removed from the computer.