Если ваш оператор catch должен получить доступ к переменной, объявленной в операторе using, то внутри это ваш единственный вариант.
Если вашему заявлению на выгрузку нужен объект, на который ссылается использование, прежде чем он будет удален, тогда ваш единственный вариант.
Если ваша инструкция catch принимает действие неизвестной продолжительности, например, отображает сообщение пользователю, и вы хотели бы избавиться от своих ресурсов до того, как это произойдет, тогда внешний вариант является вашим лучшим вариантом.
Всякий раз, когда у меня есть scenerio, подобный этому, блок 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);
}
}
Только примечание: один должен быть осторожным, чтобы только исключения улове, что на самом деле может быть _handled_ (исправленных), за исключением рубок, или оборачивать их. –
Имейте в виду, что также последний '}' оператора 'using' может вызывать исключение [как напомнено здесь] (https://msdn.microsoft.com/en-us/library/aa355056%28v=vs. 110% 29.aspx). –
TIL, что отладчик (в VS) не будет вызывать метод dispose, если вы используете первый блок кода. Поскольку сам оператор using может генерировать исключение, он помогает мне использовать второй блок, чтобы гарантировать, что подразумеваемый 'finally' называется методом dispose. – ShooShoSha