The redirections are part of the setup for running a command. > and < tie the STDOUT and STDIN streams to a file. This processing is handled by the shell, not the program being executed, so they are not considered part of the programs argument list. Since this is pre-execution setup work as well, the redirection happens before the program is executed, thus happen even if the program execution fails.
So, given the command line:
zcho It is cold today! > winter.txt
The shell would
Parse the line into it's components
Argument list: ['zcho', 'It', 'is', 'cold', 'today!']
Redirections: STDOUT -> winter.txt
Setup STDIN, STDOUT, and STDERR
STDIN: tied to the shell's current STDIN stream
STDOUT: tied to a new stream created by opening winter.txt for writing (with truncation)
STDERR: tied to the shell's current STDERR stream.
Extract the first argument and use it as the program/command name (zcho)
Attempt to execute the program/command with the arguments given
You can confirm the redirection happens first by running your invalid command with STDERR redirection:
kicken@web1:~$ zcho It is cold today! 2> error.txt
kicken@web1:~$ cat error.txt
-bash: zcho: command not found
The error message from the zcho command is redirected to the error.txt file rather than displayed in the terminal.