Pergunta

O utilizando captura a exceção ou jogá-lo? ou seja

using (StreamReader rdr = File.OpenText("file.txt"))
{
 //do stuff
}

Se o StreamReader lança uma exceção é pego usando ou jogado assim que a função chamar pode lidar com isso?

Foi útil?

Solução

usando declarações não comer exceções.

Todos "Usando" faz é alcance o objeto ao bloco usando e automaticamente chama Dispose () sobre o objeto quando ele sai do bloco.

Há uma pegadinha, porém, se um thread está com força abortada por uma fonte externa, é possível que Descarte nunca será chamado.

Outras dicas

Quando você vê uma instrução usando, pense este código:

StreadReader rdr = null;
try
{
    rdr = File.OpenText("file.txt");
    //do stuff
}
finally
{
    if (rdr != null)
        rdr.Dispose();
}

Assim, a verdadeira resposta é que ele não faz nada com a exceção lançada no corpo do bloco usando. Ele não lida com ele ou relançar-lo.

using permite a exceção a ferver através . Ele age como um try / finally, onde o finalmente dispõe o objeto usado. Assim, só é apropriado / útil para objetos que implementam IDisposable.

Ele lança a exceção, por isso ou o seu contendo necessidades método de lidar com isso, ou passá-lo para cima da pilha.

try
{
    using (
        StreamReader rdr = File.OpenText("file.txt"))
    { //do stuff 
    }
}
catch (FileNotFoundException Ex)
{
    // The file didn't exist
}
catch (AccessViolationException Ex)
{
    // You don't have the permission to open this
}
catch (Exception Ex)
{
    // Something happened! 
}

Todas as exceções que são lançadas na expressão de inicialização da instrução usando irá propagar-se o escopo do método e pilha de chamadas como esperado.

Uma coisa que atente para, porém, é que, se um occures de exceção na expressão de inicialização, em seguida, o método Dispose () não será chamado na variável expressão. Isso é quase sempre o comportamento que você gostaria, desde que você não quer se preocupar descartar um objeto que não foi realmente criado. No entanto, pode haver um problema em circunstâncias complexas. Isto é, se várias inicializações são enterrados dentro do construtor e alguns conseguem antes da exceção sendo lançada, então a chamada Descarte pode não ocorrer nesse ponto. Isso geralmente não é um problema, embora, desde construtores são geralmente mantidos simples.

No seu exemplo, se File.OpenText joga, o Dispose vai não ser chamado.

Se a exceção acontece em //do stuff, o Dispose ser chamado.

Em ambos os casos, a exceção é normalmente propagada fora do escopo, como seria sem a usando comunicado.

Se você não especificamente capturar uma exceção é lançada a pilha até que algo faz

O uso não interfira com a manipulação de excepção para além da limpeza de material no seu âmbito de aplicação.

Não lidar com exceções, mas permite exceções passar.

garantias using * o objeto criado será eliminado no final do bloco, mesmo que uma exceção é lançada. A exceção é não pego. No entanto, você precisa ter cuidado sobre o que você faria se você tentar pegá-lo sozinho. Uma vez que qualquer código que captura a exceção é fora do bloco escopo definido pela instrução using, o seu objeto não estará disponível para esse código.

* barrando os suspeitos habituais, como falta de energia, holocausto nuclear, etc

Você pode imaginar usando como try ... finalmente bloco sem o bloco catch. No último bloco, IDisposable.Dispose é chamado, e uma vez que não há nenhum bloco catch, todas as exceções são jogados para cima da pilha.

"usando" não capturar exceções, é apenas dispõe de recursos em caso de exceções não tratadas.

Talvez a pergunta é, será que dispor de recursos alocados nos parênteses se um erro também ocorreu na declaração? É difícil imaginar tanto acontecimento, no entanto.

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