Trabalhando com o recurso de Eventos do CDI
O VRaptor agora trata o fluxo principal do request utilizando eventos do CDI. A seguinte imagem exibe os eventos disparados e seus respectivos observers:

Eventos disparados pelo VRaptor
| VRaptorInitialized | Disparado no startup da aplicação, indicando que o VRaptor foi inicializado. |
| RequestStarted | Disparado no início de cada request. |
| RequestSucceeded | Disparado no final do request, apenas caso ela tenha sido processada sem nenhum erro. |
| ControllerFound e ControllerNotFound | Vão indicar se o Controller que atende a url do request foi encontrado ou não. |
| InterceptorsReady e InterceptorsExecuted | Indicam o momento em que a stack de interceptors será executada e logo após sua conclusão. |
| MethodReady e MethodExecuted | Quando o método do controller será executado e logo após sua conclusão. |
Observando nossos eventos
Você pode observar qualquer evento disparado pelo VRaptor, para isso basta criar um método com a anotação @Observes do pacote javax.enterprise.event antes do evento como parâmetro. Algo como:
import javax.enterprise.event.Observes;
import br.com.caelum.vraptor.events.ControllerNotFound;
public class MeuObserver {
public void metodo(@Observes ControllerNotFound evento) { ... }
} Note que dentro do método void metodo() você pode inserir alguma ação para quando o controller não for encontrado.
É importante lembrar que não existe ordem na execução dos observers, ou seja, não há garantia que o meu método será executado antes ou depois de qualquer outro método que observe este mesmo evento. Caso a ordem seja importante, considere utilizar interceptors.
Mais sobre eventos
Esse interessante recurso te ajuda a diminuir o acoplamento de seu código de forma elegante. Você pode ler mais a respeito dos eventos do CDI em sua especificação e também nesse post do blog da caelum.