Перехват исключения (стоит ли) C#

104
10 ноября 2021, 15:20

Мне кажется код немного кривоват, но не могу понять как лучше его переделать. Код:

void Button1Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    {
        if (!System.IO.File.Exists(openFileDialog1.FileName))
        {
            throw new PathException("Некорректный путь к файлу", openFileDialog1.FileName);
        }
        try
        {
            textBox7.Text = openFileDialog1.FileName;
        }
        catch (PathException ex)
        {
            MessageBox.Show(String.Format("{0}: {1}", ex.Message, ex.PathValue), "Ошибка.", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
        }
    }       
}

Класс исключения:

public class PathException : ArgumentException
{   
    public string PathValue {get; set;}
    public PathException(string message, string pathValue)
        :base(message)
    {
        PathValue = pathValue;
    }
}

Что можно исправить?

Answer 1

Я предполагаю, что вы хотели поместить начало блока try до if (в текущем виде код не имеет смысла).

Большинство методов работы с файлами в .NET автоматически бросают исключение, если файла не существует, так что вам может и не нужна такая проверка в явном виде. У OpenFileDialog по умолчанию есть предупреждение при выборе несуществующего файла. Но так или иначе, нет смысла бросать исключение только из-за того, что пользователь ввел несуществующий файл. Проброс исключений - довольно тяжелая операция, которая предназначена для действительно исключительных ситуаций. Вы могли бы сделать так:

if (!System.IO.File.Exists(openFileDialog1.FileName))
{
    MessageBox.Show("Некорректный путь к файлу " + openFileDialog1.FileName);
    return;
}

Если вы все же бросаете исключения, нет смысла ловить их тут же только для того, чтобы вывести сообщение. Польза исключений отчасти в том, чтобы захватить стек вызовов для облегчения отладки сложного кода. При таком коде эти данные теряются.

Обычная практика относительно исключений это одно из двух:

  • Просто позволить программе упасть. В этом случае выведется сообщение и диагностическая информация попадет в системный журнал

  • Перехватить исключение и вывести сообщение, но при этом логировать с помощью собственного механизма его полные данные (ex.ToString())

READ ALSO
Unity. Вкл/Выкл BoxCollider 2D у всех клонов объекта

Unity. Вкл/Выкл BoxCollider 2D у всех клонов объекта

Есть 2 объекта: BallRed, BallBlue которые спавнятся в игре в разных количествах Как при каком либо условии выбрать все созданные клоны, и отключить/включить...

101
C# AnglesSharp response error "Too Many Requests"

C# AnglesSharp response error "Too Many Requests"

Я делаю парсер, использую AnglesSharp и при попытке получить ресурсы сайта он кидает мне ошибку, мол слишком много запросов, хотя в этой тестовой...

206
Как передать список, состоящий из '{\$_POST['Name']}' в VALUES?

Как передать список, состоящий из '{\$_POST['Name']}' в VALUES?

Всем приветЧтение руководства и поиск в интернете не помогают мне, видимо потому что плохо формулирую вопрос

139