There are two reasons for this. Second, it means that programs that need to parse your filter's output won't get confused by error messages that don't follow the standard output format. If your program can fail, always return a nonzero status on failure. This makes it much more useful in scripts. When it's not too difficult to do so, return codes should be meaningful, so that callers can distinguish different types of errors.
Many programs accept the names of files to be processed in some manner.
If your program processes a file, you should ask yourself whether it would be possible for it to process more than one at a time in some meaningful fashion. Don't just exit silently. Other times, as in SunOS 4.1.1, it's just not there. But that's no excuse. Remember that the cause of the error may be far removed from the symptoms.