Если вашему оператору catch нужно получить доступ к переменной, объявленной в операторе using, то внутри - ваш единственный вариант.
Если вашему выражению catch требуется объект, на который ссылается использование, до его удаления, то внутри - ваш единственный вариант.
Если ваш оператор catch выполняет действие неизвестной длительности, например, выводит сообщение пользователю, и вы хотели бы распоряжаться своими ресурсами до того, как это произойдет, тогда лучшим вариантом является внешний.
Всякий раз, когда у меня есть сценарий, подобный этому, блок try-catch обычно находится в другом методе дальше по стеку вызовов от использования. Для метода нетипично знать, как обрабатывать исключения, возникающие в нем, вот так.
Итак, мое общее рекомендация - снаружи, далеко снаружи.
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);
}
}