Pergunta
Eu tenho algum código que ignora uma exceção específica.
try
{
foreach (FileInfo fi in di.GetFiles())
{
collection.Add(fi.Name);
}
foreach (DirectoryInfo d in di.GetDirectories())
{
populateItems(collection, d);
}
}
catch (UnauthorizedAccessException ex)
{
//ignore and move onto next directory
}
Claro que isso resulta em um aviso de tempo de compilação como ex não é utilizada. Existe algum padrão aceito noop que deve ser usado para remover este aviso?
Solução
Apenas reescrevê-lo como
catch (UnauthorizedAccessException) {}
Outras dicas
Como Dave M. e tvanfosson disse, você quer reescrevê-lo como
catch (UnauthorizedAccessException) {}
A grande questão que deve ser feita, no entanto, é por isso que você está pegando uma exceção em ignorá-lo (comumente chamado de engolir a exceção)? Esta é geralmente uma má idéia, pois ele pode (e geralmente faz) ocultar problemas na aplicação em tempo de execução que podem levar a resultados muito estranhos e um tempo difícil depuração-los.
Eu costumo fazer
Debug.WriteLine(ex.message)
(que maneira eu posso apenas definir um ponto de interrupção na exceção, se necessário, também)
Assumindo que o comentário em seu código original é uma descrição exata do que você está tentando fazer, eu acho que você quer escrever assim:
foreach (FileInfo fi in di.GetFiles())
{
//TODO: what exceptions should be handled here?
collection.Add(fi.Name);
}
// populate collection for each directory we have authorized access to
foreach (DirectoryInfo d in di.GetDirectories())
{
try
{
populateItems(collection, d);
}
catch (UnauthorizedAccessException)
{
//ignore and move onto next directory
}
}
E então você precisa trabalhar nesse item TODO.
Eu concordo com as pessoas que dizem que é provavelmente uma má idéia de simplesmente ignorar a exceção. Se você não está indo para re-jogá-lo, em seguida, pelo menos registrá-lo em algum lugar. Eu escrevi pequenas ferramentas que processam uma lista de arquivos que eu não queria erros em arquivos individuais para travar todo o programa, e nesses casos eu iria imprimir uma mensagem de aviso para que eu pudesse ver quais arquivos foram ignorados.
A única vez que eu pessoalmente sempre capturar uma exceção sem nomeá-lo, como no catch (xxxException), é se eu vou reagir a ela de alguma forma e, em seguida, re-jogá-lo para que eu possa pegá-lo em algum rotina exterior. Por exemplo:.
try
{
// do something
// ...
}
catch(UnauthorizedAccessException)
{
// react to this exception in some way
// ...
// let _someone_ know the exception happened
throw;
}
Mesmo que eu sou um desenvolvedor Java (não C #), @ Scott Dorman está absolutamente certo. Por que você está "engolir a exceção"? Melhor ainda, o que poderia jogar o UnauthorizedAccessException? Aqui estão as possibilidades de senso comum:
- O arquivo não existe
- O diretório não existe
- O segmento atual de controle não tem os privilégios de segurança corretas. No mundo * nix, o segmento atual pode estar no grupo errado ou o usuário errado.
- O rígido caiu
- ACL do arquivo é definido para escrever, mas só não ler. Da mesma forma, para o diretório.
A descrição acima, claro, é uma lista incompleta.