Dove metto try/catch con l'istruzione using?

Dove metto try/catch con l'istruzione using?

Se la tua istruzione catch ha bisogno di accedere alla variabile dichiarata in un'istruzione using, allora inside è la tua unica opzione.

Se la tua istruzione catch ha bisogno dell'oggetto a cui si fa riferimento nell'utilizzo prima di essere eliminato, inside è la tua unica opzione.

Se la tua istruzione catch esegue un'azione di durata sconosciuta, come la visualizzazione di un messaggio all'utente, e desideri smaltire le tue risorse prima che ciò avvenga, la scelta migliore è l'esterno.

Ogni volta che ho uno scenario simile a questo, il blocco try-catch è solitamente in un metodo diverso più in alto nello stack di chiamate rispetto all'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, molto fuori.

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);
    }
}

Suppongo che questo sia il modo preferito:

try
{
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine(message);
    }
}
catch(Exception ex)
{
   // Handle exception
}

Se hai comunque bisogno di un blocco try/catch, l'istruzione using non ti sta comprando molto. Abbandonalo e fallo invece:

StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}