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?

Foi útil?

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:

  1. O arquivo não existe
  2. O diretório não existe
  3. 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.
  4. O rígido caiu
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top