Если код который пытается получить доступ к файлу, находится на переднем конце, например обработчик события для щелчка, тогда нормально проверять наличие ошибки, отображать сообщение и возвращать его.
Если я правильно понимаю ваш вопрос вы хотите знать, нужно ли это сделать:
public void button_Click() {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // would have thrown an exception if the file didn't exist
}
Это было бы хорошо, за исключением случаев, ProcessFile бросает любой другой вид исключений не будет обрабатываться.
Вы можете сделать это:
public void button_Click() {
try {
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
На мой взгляд, лучше сделать так:
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
MessageBox.Show("Could not find the file");
return;
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
Таким образом, вы можете обеспечить наиболее конкретное сообщение пользователю соответствующий тому, что он делает с этой точки зрения. Например, если он пытался открыть файл Excel, вы могли бы сказать: «Не удалось найти файл Excel, который вы хотите импортировать».
Это также работает, если файл был удален или переименован между указанной вами точкой и точкой, которую вы пытались обработать.
В качестве альтернативы вы могли бы сделать что-то подобное с этим:
public void button_Click() {
try {
if(!File.Exists(textBox.Text)) {
throw new UserException("Could not find the file");
}
ProcessFile(textBox.Text); // throwns an exception if the file didn't exist
} catch(Exception ex) {
MessageBox.Show(GetUserMessage(ex));
return;
}
}
В этом случае вы можете создать свой собственный класс Exception UserException
и просто передать это сообщение вместе без его перевода. Это позволит вам повторно использовать тот же код, который вы используете для отображения сообщения.
Исключение в классах
Если ошибка происходит в каких-то библиотеках классов, то вы должны бросить исключение. Цель исключения заключается в том, что ошибка не может остаться незамеченной.
Например, вы не должны хотеть этого:
class MyFileHandler {
public void OpenFile(string fileName) {
if(!File.Exists(fileName)) return;
// do stuff
}
public void DoStuff() {
// do stuff
}
}
Теперь, если разработчик называется myFileHandlerInstance.OpenFile("note.txt")
он предположил, что это сработало.Вы можете вернуть логическое значение, так как:
class MyFileHandler {
public bool OpenFile(string fileName) {
if(!File.Exists(fileName)) return false;
// do stuff
return true;
}
public void DoStuff() {
// do stuff
}
}
Но теперь вы полагаетесь на разработчике проверку того, что значение, это имело обыкновения быть распространенным методом, но ошибки были проигнорированы, и упускать из вида и поэтому исключения стали лучшей практикой.
Что касается отображения пользователю, вы действительно не должны отображать сообщение об исключении напрямую, эти сообщения предназначены для разработчиков, а не для пользователей. Я предлагаю метод, который принимает объект исключения и возвращает лучшее сообщение, например, так:
public string GetUserErrorMessage(Exception ex) {
if(ex is FileLoadException) {
var fileLoadException = (FileLoadException)ex;
return "Sorry but we failed to load the file: " + fileLoadException.FileName;
}
}
Вы можете проверить свойство исключений для деталей, включая коды ошибок, если вам нравится. Кроме того, я предлагаю собирать данные о фактических исключениях где-то для ваших собственных целей отладки, где-то там, где это не видно пользователю.
Это все * действительно * плохая идея. Вы уже получаете достойное сообщение исключения без всего этого кода. Просто поймайте исключение, которое конструктор StreamReader выбрасывает и отображает его свойство Message. –
Да, я понимаю, но я хочу показать пользовательское сообщение, которое пользователи могут легко понять, и не лучше ли избежать исключения, чем поймать его? – CudoX
Вы должны отделить презентацию сообщения от доступа io. Возможно, ваш код когда-нибудь будет использоваться в консольном приложении? Btw, используйте исключения только для неожиданных путей выполнения, а не для чего-то вроде несуществующих файлов. –