However, it is worth taking it a step further and focus on "why the error occurred" instead of "an error has occurred".
An example of this is Code Contracts. Like Intellisense, live code analysis with contracts would tell you "the method you call will throw <exception-type> with the input you give".
Not only will that cover giving the user information about which error conditions that can arise, it will also give you the reason why.