Don't blame the user for your errors
Note that the context where you want to show a error message may actually be wrong. You say:
Take a form where a user must input a positive integer. If they don't put in a correct value, say -1, the form will fail validation.
Aren't you in the control of the form in the first place? If you are, why do you allow the user to enter an invalid value, just in order to have a chance to blame him for that?
Instead of being mean to the user, prevent the errors before they happen. If this is a simple form with a simple text box, accept digits (and a dot/comma according to the current culture, if applicable), but no minus sign.
Don't show a error when you can avoid it
There are cases, naturally, where you can't be strict about the allowed characters. The value may come from a plain text configuration file, or the input control of a form may handle inputs such as “53*2-198” where a minus sign is perfectly valid as input, and only a negative value isn't.
In those cases, think about alternative behavior which doesn't involve blaming and finger-pointing. One such behavior is to default the value, for instance to zero. Sometimes it doesn't make sense whatsoever. Sometimes it does. Adobe Illustrator, for instance, when faced with a negative value as a width or height of an object, defaults it to 0.0001 mm. While the user rarely wants this behavior, a error message won't bring anything useful there.
Sometimes, the error is so obvious, that no explicit message is needed, and just highlighting the value in a specific color would be enough. One common example is the mandatory values, where the empty fields would be highlighted differently if the user leaves a focus without entering anything in them.
If a error is shown, explain what's wrong, and give suggestions
It's not one or the other, but both.
I have answered a very similar question on UX.SE. The idea is that you should start by saying what's wrong, and then suggest a solution. In a case where a given field has a negative number (for instance a value in a configuration file), the message would look like this:
The minimum threshold defined in
stack.thresholds.min cannot be a negative value. Specify a value within the range 0..1000.
The message starts telling what's wrong—the value is outside the valid range—and then gives a suggestion that the user might follow. Or the user may do something else, like removing the value to set it to the default one, for instance.
Think why the error was made in the first place
Assume users are not completely stupid. They may make mistakes, but if a specific field gets a lot of invalid input, it is indicative of a problem in the interface of your application.
One example is a form which asks to enter your address, and gives a one-line field. Most persons would assume that they are asked to provide their email address, and would be surprised to see a error message telling that the input wasn't recognized as a valid postal address. Statistics about the error message being shown would highlight an issue within the user interface and give a chance to fix it.