Si su declaración catch necesita acceder a la variable declarada en una declaración using, entonces dentro es su única opción.
Si su declaración catch necesita el objeto al que se hace referencia antes de desecharlo, entonces su única opción es dentro.
Si su declaración catch toma una acción de duración desconocida, como mostrar un mensaje al usuario, y desea deshacerse de sus recursos antes de que eso suceda, entonces afuera es su mejor opción.
Cada vez que tengo un escenario similar a este, el bloque try-catch generalmente está en un método diferente más arriba de la pila de llamadas que el uso. No es típico que un método sepa cómo manejar excepciones que ocurren dentro de él de esta manera.
Así que mi recomendación general es afuera, muy afuera.
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);
}
}