Мне кажется код немного кривоват, но не могу понять как лучше его переделать. Код:
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;
}
}
Что можно исправить?
Я предполагаю, что вы хотели поместить начало блока try до if (в текущем виде код не имеет смысла).
Большинство методов работы с файлами в .NET автоматически бросают исключение, если файла не существует, так что вам может и не нужна такая проверка в явном виде. У OpenFileDialog по умолчанию есть предупреждение при выборе несуществующего файла. Но так или иначе, нет смысла бросать исключение только из-за того, что пользователь ввел несуществующий файл. Проброс исключений - довольно тяжелая операция, которая предназначена для действительно исключительных ситуаций. Вы могли бы сделать так:
if (!System.IO.File.Exists(openFileDialog1.FileName))
{
MessageBox.Show("Некорректный путь к файлу " + openFileDialog1.FileName);
return;
}
Если вы все же бросаете исключения, нет смысла ловить их тут же только для того, чтобы вывести сообщение. Польза исключений отчасти в том, чтобы захватить стек вызовов для облегчения отладки сложного кода. При таком коде эти данные теряются.
Обычная практика относительно исключений это одно из двух:
Просто позволить программе упасть. В этом случае выведется сообщение и диагностическая информация попадет в системный журнал
Перехватить исключение и вывести сообщение, но при этом логировать с помощью собственного механизма его полные данные (ex.ToString()
)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть 2 объекта: BallRed, BallBlue которые спавнятся в игре в разных количествах Как при каком либо условии выбрать все созданные клоны, и отключить/включить...
Для коллекции "records" состоящей из экземпляров класса FileCabinetRecord
Я делаю парсер, использую AnglesSharp и при попытке получить ресурсы сайта он кидает мне ошибку, мол слишком много запросов, хотя в этой тестовой...
Всем приветЧтение руководства и поиск в интернете не помогают мне, видимо потому что плохо формулирую вопрос