Qual:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
OU
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
fonte
fonte
}
dausing
declaração pode lançar uma exceção como lembrado aqui .finally
chamado método de descarte.Respostas:
Eu prefiro o segundo. Também pode interceptar erros relacionados à criação do objeto.
fonte
try
bloco, que permite exibir uma mensagem de erro se algo falhar, o programa agora tem a capacidade de recuperar e informar o usuário.using( DBConnection conn = DBFactory.getConnection())
que precisaria ser revertida em caso de uma exceção. Parece-me que ambos têm o seu lugar.Como um bloco using é apenas uma simplificação de sintaxe de uma tentativa / finalmente ( MSDN ), pessoalmente eu faria o seguinte, embora eu duvide que seja significativamente diferente da sua segunda opção:
fonte
finally
bloco é preferível àusing
declaração?finally
bloco que descarta um objeto IDisposable é o que umausing
instrução faz. Pessoalmente, eu gosto disso em vez dousing
bloco incorporado porque acho que indica mais claramente onde tudo está acontecendo e que tudo está no mesmo "nível". Eu também gosto disso mais do que váriosusing
blocos incorporados ... mas é tudo apenas a minha preferência.try
instrução para ser descartado dentro dafinally
instrução; caso contrário, ele lançará um erro do compilador: "Uso da variável local não atribuída 'myObject'" "Cannot assign null to implicitly-typed local variable
;) Mas eu sei o que você quer dizer e, pessoalmente, prefere isso a aninhar um bloco usando.Depende. Se você estiver usando o Windows Communication Foundation (WCF),
using(...) { try... }
não funcionará corretamente se o proxy nausing
instrução estiver no estado de exceção, ou seja, a eliminação deste proxy causará outra exceção.Pessoalmente, acredito na abordagem de manipulação mínima, ou seja, lide apenas com a exceção que você conhece no ponto de execução. Em outras palavras, se você souber que a inicialização de uma variável
using
pode gerar uma exceção específica, eu a envolvotry-catch
. Da mesma forma, seusing
algo dentro do corpo pode acontecer, que não está diretamente relacionado à variávelusing
, então envolvo-o com outrotry
para essa exceção específica. Eu raramente usoException
nas minhascatch
es.Mas eu gosto
IDisposable
e,using
portanto, talvez seja tendenciosa.fonte
Se sua instrução catch precisar acessar a variável declarada em uma instrução using, então inside é sua única opção.
Se a sua instrução catch precisar do objeto referenciado no uso antes de ser descartado, o interior é sua única opção.
Se a sua declaração de captura executar uma ação de duração desconhecida, como exibir uma mensagem para o usuário, e você desejar descartar seus recursos antes que isso aconteça, a parte externa é sua melhor opção.
Sempre que eu tenho um cenário semelhante a esse, o bloco try-catch geralmente está em um método diferente, além da pilha de chamadas do uso. Não é típico para um método saber como lidar com exceções que ocorrem dentro dele dessa maneira.
Portanto, minha recomendação geral é do lado de fora - do lado de fora.
fonte
Ambos são sintaxe válida. Na verdade, tudo se resume ao que você deseja fazer: se você deseja capturar erros relacionados à criação / descarte do objeto, use o segundo. Caso contrário, use o primeiro.
fonte
Há uma coisa importante que chamarei aqui: a primeira não capturará nenhuma exceção resultante de chamar o
MyClass
construtor.fonte
No C # 8.0, eu prefiro usar o segundo igual a este
e depois
fonte
Se o objeto que você está inicializando no bloco Using () pode lançar qualquer exceção, você deve procurar a segunda sintaxe, caso contrário ambas são igualmente válidas.
No meu cenário, eu tive que abrir um arquivo e estava passando filePath no construtor do objeto que estava inicializando no bloco Using () e isso pode gerar uma exceção se o filePath estiver errado / vazio. Portanto, neste caso, a segunda sintaxe faz sentido.
Meu código de amostra: -
fonte
A partir do C # 8.0 , você pode simplificar as
using
instruções sob algumas condições para se livrar do bloco aninhado e, em seguida, ele se aplica apenas ao bloco anexo.Portanto, seus dois exemplos podem ser reduzidos a:
E:
Ambos são bem claros; e isso reduz a escolha entre os dois a uma questão de como você deseja que o escopo do objeto esteja, onde você deseja lidar com erros de instanciação e quando deseja descartá-lo.
fonte