Vim script で end 系のコマンドを :execute できない理由

LingrVim 部屋で次のようなコードが投げられました。

http://lingr.com/room/vim/archives/2013/12/22#message-17893985

let g:queue = range(9)
command! WHILE while !empty(g:queue)
command! END endwhile
" echo g:queue

WHILE
    echo remove(g:queue, 0)
END


このコードがエラーになるのは Vim script が行単位で読み込まれるためです。
つまり WHILE が読み込まれて while !empty(g:queue) が実行された時にまだ END は読み込まれておらず endwhile が見つからなくてエラーになります。
なので

while 1
    echo "homu"
execute "endwhile"


のように endwhile を execute で実行する場合もエラーになります。
これは while にかぎらずに if や for、try などでも同様のエラーになります。
また、同様に catch を :execute で実行した場合も正しく動作しません。

try
    throw 42
" throw した時にまだ実行されておらず catch は行われない
execute "catch /" . 42 . "/"
    echo "homu"
endtry