The user should see nothing, or as little as possible. If your program can adapt to the error without the users input, it should (as an example, using relative paths to ensure that if your program is moved it doesn't break).
If it needs further input, it should ask for it directly (this file seems to have moved--where is it now?)
If it's an unexpected exception, always append as much of your state as you can to a log and restart. Never clear this log. If you cannot start, offer the user the ability to send you his log in a Very Short Dialog. Make it trivial to send, a single button-press if possible.
Don't expect them to read a dialog and implement a solution for you. If you know enough about what's going on in the dialog to have them fix it, fix it for them. If you don't, don't have them guess, have them contact you (assuming it's internal company support).
Whenever you solve a problem, be sure to incorporate it back into your program so you don't see that problem again.