Se la dichiarazione di cattura deve accedere alla variabile dichiarata in un'istruzione using, quindi all'interno è l'unica opzione.
Se l'istruzione catch richiede l'oggetto a cui si fa riferimento nell'uso prima che venga eliminato, all'interno è l'unica opzione.
Se la dichiarazione di cattura prende un'azione di durata sconosciuta, come visualizzare un messaggio per l'utente e si desidera disporre delle risorse prima che ciò accada, quindi all'esterno è l'opzione migliore.
Ogni volta che ho uno scenerio simile a questo, il blocco try-catch si trova di solito in un altro metodo più in alto nello stack di chiamate dall'utilizzo. Non è tipico per un metodo sapere come gestire le eccezioni che si verificano al suo interno in questo modo.
Quindi la mia raccomandazione generale è fuori dall'esterno.
private void saveButton_Click(object sender, EventArgs args)
{
try
{
SaveFile(myFile); // The using statement will appear somewhere in here.
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
}
fonte
2011-05-26 22:13:16
Solo una nota: bisogna stare attenti al sole eccezioni di cattura che possono essere effettivamente _handled_ (corretti), tranne che per la registrazione, o avvolgendoli. –
Si prega di tenere presente che anche l'ultimo '}' dell'istruzione 'using' può generare un'eccezione [come ricordato qui] (https://msdn.microsoft.com/en-us/library/aa355056%28v=vs. 110% 29.aspx). –
TIL che il debugger (in VS) non chiamerà il metodo dispose se si utilizza il primo blocco di codice. Poiché l'istruzione using può lanciare un'eccezione, mi aiuta a usare il secondo blocco per garantire che il 'dispose 'abbia chiamato il metodo dispose. – ShooShoSha