Куда мне положить try/catch с помощью оператора using?

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

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

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

Я положил try/catch блоки внутри using Скажите или, вокруг него? Или оба?

3 ответа

Решение

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

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

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

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

StreamWriter sw = null;
try
{
    sw = File.AppendText(filePath);
    sw.WriteLine(message);
}
catch(Exception)
{
}
finally
{
    if (sw != null)
        sw.Dispose();
}
Другие вопросы по тегам