Pergunta

Estou tentando aproveitar cada vez mais o bloco using atualmente, quando tenho um objeto que implementa IDisposable, mas uma coisa que não descobri é como capturar uma exceção como faria em um try/catch/finalmente normal.algum exemplo de código para me apontar na direção certa?

Editar:A pergunta foi modificada após a leitura das respostas.Foi "Como lançar uma exceção em um bloco de uso com .NET 2.0?" Mas eu estava realmente procurando uma maneira de pegar essas exceções dentro de um bloco de uso.


Estou procurando mais detalhes sobre como rolar meu próprio bloco de captura dentro de um bloco de uso.

Editar:O que eu queria evitar é ter que usar try/catch/finally dentro do meu bloco using, como @Blair mostrou.Mas talvez isso não seja um problema...

Editar:@Blair, era exatamente isso que eu procurava, obrigado pela resposta detalhada!

Foi útil?

Solução

Eu realmente não entendo a pergunta - você lança uma exceção como faria normalmente.Se MyThing implementos IDisposable, então:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

E thing.Dispose será chamado quando você sair do bloco, conforme a exceção for lançada.Se você quiser combinar um try/catch/finally e um using, você pode aninhá-los:

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(Ou coloque try/catch/finalmente no uso):

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

Ou você pode desenrolar o using e chamar explicitamente Dispose no finally bloco como @Quarrelsome demonstrou, adicionando qualquer código extra de tratamento de exceção ou recuperação que você precisa no finally (ou no catch).

EDITAR:Em resposta ao @Toran Billups, se você precisar processar exceções além de garantir que seu Dispose método é chamado, você terá que usar um using e try/catch/finally ou desenrole o using - Não creio que haja outra maneira de realizar o que você deseja.

Outras dicas

Sim, não há nada diferente em lançar exceções no uso de blocos.Lembre-se de que o bloco using se traduz basicamente em:

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

Então você terá que rolar sua própria captura se quiser pegar alguma coisa, mas pegar/arremessar é uma preocupação completamente separada do uso.É quase garantido que o finalmente seja executado (salve uma exceção incapturável (por exemplostackoverflow ou outofmemory) ou alguém desligando o PC).

Você precisa ter uma instrução try para capturar uma exceção

Você pode usar uma instrução try dentro do bloco using ou pode usar um bloco using em um bloco try

Mas você precisa usar um bloco try para capturar quaisquer exceções que ocorram

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