Где я могу поставить try/catch с помощью инструкции "using"?

Возможный дубликат:
try/catch + using, правильный синтаксис

Я хотел бы try/catch следующее:

        //write to file
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(message);
        }

Я размещаю блоки try/catch внутри оператора using или вокруг него? Или оба?

Ответ 1

Если ваш оператор catch должен получить доступ к переменной, объявленной в операторе using, то внутри это ваш единственный вариант.

Если вашему заявлению catch нужен объект, на который ссылается использование, прежде чем он будет удален, тогда ваш единственный вариант.

Если ваш оператор 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);
    }
}

Ответ 2

Я предполагаю, что это предпочтительный способ:

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

Ответ 3

Если вам нужен блок try/catch, то оператор using не покупает вас много. Просто бросьте это и сделайте это вместо этого:

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