VRaptor 3 - tratamento de erro nas aplicações

faltou um @Component no DiscoDAO

Pessoal,

Estou tentando validar a minha aplicação, eu tenho uma página em que são enviados três arquivos, os nomes desses arquivos tem um regra envolvida, dai criei uma classe que será responsável por esse upload, e nela tenho as regras para os nomes dos meus arquivos. A partir do controller eu invoco o método que inicia o processo de upload(valida o nome, cria os diretórios e envia os arquivos).

Problema:
Implementei a funcionalidade utilizando exceções(“IllegalArgumentsException”) para informar os problemas na minha regra de negócios. a classe subia as exceções até o controller e no controller eu mostrava elas na tela. Porém caso o erro estivesse no nome do primeiro arquivo, como eu lancei uma exceção, o fluxo é interrompido e não valido os demais arquivos.

Questionamentos:
Teria uma forma melhor em fazer isso? Preciso validar todos os arquivos e depois mostrar todas as mensagens de erro na tela.
Vi muitas discussões a respeito de ExceptionHandler, isso já foi incorporado na versão 3.5.1?

[b]Classe responsável pela validação e upload.

[code]@Component
public class UploadArquivosContraChequeBKP {

public void salvarArquivos(List<UploadedFile> arquivos, String path)
		throws Exception {
	if (!arquivos.isEmpty()) {
		criaDiretorio(path);
		for (Iterator<UploadedFile> iterator = arquivos.iterator(); iterator
				.hasNext();) {
			UploadedFile uploadedFile = (UploadedFile) iterator.next();
			String fileName = uploadedFile.getFileName();
			if (validaNomeArquivo(fileName)) {
				try {
					IOUtils.copyLarge(uploadedFile.getFile(),
							new FileOutputStream(new File(path + fileName)));
				} catch (FileNotFoundException e) {
					throw new FileNotFoundException(
							"Problemas ao enviar arquivo!" + e.getMessage());
				}
			} else {
				throw new IllegalArgumentException(
						"Problemas ao enviar arquivo!");
			}
		}
	}
}

private void criaDiretorio(String novoDiretorio)
		throws FileNotFoundException {
	String nomeDiretorio = null;
	nomeDiretorio = novoDiretorio;
	if (!new File(nomeDiretorio).exists()) {
		(new File(nomeDiretorio)).mkdirs();
	}
}

private boolean validaNomeArquivo(String nomeArquivo) throws Exception {
	List<String> subStrings = separaString(nomeArquivo);
	if (subStrings.size() != 3) {
		throw new IllegalArgumentException(
				"Formato do nome do arquivo inválido! Arquivo: "
						+ nomeArquivo);
	} else {
		for (int i = 0; i < subStrings.size(); i++) {
			if (i == 0) {
				validaTipo(nomeArquivo, subStrings, i);
			} else if (i == 1) {
				validaPeriodo(nomeArquivo, subStrings, i);
			} else if (i == 2) {
				validaExtensao(nomeArquivo, subStrings, i);
			}
		}
	}
	return true;
}

public List<String> separaString(String nomeArquivo) {
	List<String> parametros = new ArrayList<String>();
	if (nomeArquivo.contains(".")) {
		String[] arrayPonto = nomeArquivo.split("\\.");
		for (int i = 0; i < arrayPonto.length; i++) {
			String str = arrayPonto[i];
			if (str.contains("-")) {
				String[] arrayHifen = str.split("-");
				for (int j = 0; j < arrayHifen.length; j++) {
					parametros.add(arrayHifen[j]);
				}
			} else {
				parametros.add(str);
			}
		}
	}
	return parametros;
}

private boolean validaTipo(String nomeArquivo, List<String> subStrings,
		int i) {
	String tipo = subStrings.get(i);
	if (!(tipo.equalsIgnoreCase("cabecalho"))
			&& !(tipo.equalsIgnoreCase("repeticao"))
			&& !(tipo.equalsIgnoreCase("totais"))) {
		throw new IllegalArgumentException(
				"Campo tipo na nomeação do arquivo é incompatível com padrão estabelecido! Nome do Arquivo: "
						+ nomeArquivo + " Formato não permitido: " + tipo);
	}
	return true;
}

private boolean validaPeriodo(String nomeArquivo, List<String> subStrings,
		int i) {
	String periodo = subStrings.get(i);
	if (periodo.length() == 6) {
		if (periodo.matches("[0-9]+")) {
			String mes = periodo.substring(0, 2);
			String ano = periodo.substring(2, 6);
			if (Integer.parseInt(mes) <= 0 || Integer.parseInt(mes) > 12) {
				throw new IllegalArgumentException(
						"Mês informado no nome do arquivo é inválido! Nome do Arquivo: "
								+ nomeArquivo + ", Mês: " + mes);
			}
			if (Integer.parseInt(ano) < 1971) {
				throw new IllegalArgumentException(
						"Ano informado no nome do arquivo inválido! Nome do Arquivo: "
								+ nomeArquivo + ", Ano: " + ano
								+ " É menor que o menor ano permitido.");
			} else if (Integer.parseInt(ano) > new GregorianCalendar()
					.get(GregorianCalendar.YEAR)) {
				throw new IllegalArgumentException(
						"Ano informado no nome do arquivo é inválido! Nome do Arquivo: "
								+ nomeArquivo + ", Ano: " + ano
								+ " É maior que o maior ano permitido.");
			}
		} else {
			throw new IllegalArgumentException(
					"Período informado não tem somente digítos! Período:"
							+ periodo);
		}
	} else {
		throw new IllegalArgumentException(
				"Periodo informado inválido! Período: " + periodo);
	}
	return true;
}

private boolean validaExtensao(String nomeArquivo, List<String> subStrings,
		int i) {
	String extensao = subStrings.get(i);
	if (!extensao.equalsIgnoreCase("txt")) {
		throw new IllegalArgumentException(
				"Arquivo enviado não é um txt! Arquivo: " + nomeArquivo);
	}
	return true;
}

}[/code]

Adicione tudo em uma lista e depois lance a exception mostrando todos os erros da lista.