Я в настоящее время работаю над проектом, и я натолкнулся на что-то вроде главного скребка. Я программировал в Java в течение приблизительно двух лет, и я покрыл исключения, но никогда правильно понял их.
В моей текущей ситуации у меня есть свой основной метод, который инициализирует класс
WikiGraph wiki = wiki = new WikiGraph(getFile());
Конструктор Wikigraph берет имя файла, которое я получаю через DialogBox в getFile()
метод.
Конструктор для wikigraph затем называет метод названным loadfile(filename)
какой attemps загрузиться и проанализировать данный файл.
loadfile()
метод - то, где я брошу IncorrectFileTypeError.
Мой вопрос, где я должен обработать это?
В данный момент я ловлю его в loadfile()
метод
try {
//load file
} catch (IncorrectFileTypeError e){
System.out.println("Incorrect file type: "+filename+": "+e.getMessage());
throw new IncorrectFileTypeError();
}
Но я также ловлю его при инициализации WikiGraph как так:
while(wiki==null){ //While There is no valid file to add to the wikigraph
try {
wiki = new WikiGraph(getFile()); //Try to load file
} catch (IncorrectFileTypeError e) { //If file cannot be loaded
JOptionPane.showMessageDialog(null, "Incorrect File Type Given. Please Choose another file."); //Display error message
getFile(); //Prompt user for another file
}
}
Теперь путь, я обработал ошибку корректный / лучший способ? Или если это обрабатывается в другом месте, такой как в getFile()
метод?
Править: Я предполагаю, что должен сделать проблему файла немного более ясной. Расширение файла не то, на основе чего IncorrestFileTypeError, и таким образом это может быть вводящее в заблуждение ошибочное имя. Данный файл может иметь в значительной степени любое расширение, это - содержание этого, должен быть хорошо сформирован.
В этом случае я бы избегал использования исключений в качестве основного метода работы с некорректными типами файлов.Если исключение может регулярно запускаться пользователем, его не следует рассматривать как исключение. Вот подход, который я бы выбрал:
Этот подход дает вам лучшее из обоих миров - у вас есть возможность предупреждать пользователей о предоставлении неверных данных, при этом обеспечивая с точки зрения WikiGraphs точность предоставленной информации. Это дает разработчикам, работающим с WikiGraph, возможность убедиться, что их ввод действителен, без необходимости обработки исключений.
Попробуйте избежать его, звездочка является специальным символом в C
Изменить * на\*
-121--4551161-Мне нравится решение SilentGhost.
Мое решение использует функциональное программирование в python:
group = lambda t, n: zip(*[t[i::n] for i in range(n)])
group([1, 2, 3, 4], 2)
дает:
[(1, 2), (3, 4)]
Это предполагает, что размер входного перечислять делится на размер группы. В противном случае непарные элементы не будут включены.
-121--2067635-Я считаю, что этот тип ошибки (AmporedFileTypeError) может быть разрешен в форме пользовательского ввода, чтобы избежать ненужного перехода к уровню службы файловой системы.
Одним из основных преимуществ исключений является то, что они предоставляют вам удобные средства обработки исключения вдали от места его возникновения. В языках, которые его не поддерживают, вам пришлось бы каждый вызов на пути проверять возвращаемое значение, break и return, чтобы вы выполняли распространение вручную.
Имеет смысл обработать исключение, если вы чувствуете, что можете либо восстановить его, либо лучше всего сообщить об этом и отменить операцию.
Насколько я понимаю, взаимодействие начинается с ввода пользовательского интерфейса и что, если тип файла несоответствующий, вы не сможете восстановить его. Следовательно, у меня была бы любая задача пользовательского интерфейса, которая инициировала открытие файла, перехватывала исключение, сообщала пользователю о возникшей ошибке и либо отменяла, либо запрашивала другой ввод.
При втором чтении кажется, что вы открываете диалог после того, как уже начали попытки создать график. Мне лично нравится изолировать взаимодействие с пользовательским интерфейсом. Поэтому я лично сначала обрабатываю весь ввод пользовательского интерфейса, получаю ожидаемое имя файла, проверяю его соответствие моим потребностям, сообщаю пользователю, если нет, и продолжаю только дальше, если файл в порядке, а затем сообщать только о критических и неожиданных ошибках.
Я думаю, что это тип ситуации, для которой предназначены проверенные исключения (согласны вы с ними или нет). Я полагаю, IncorrectFileTypeError
расширяет Ошибка
? Расширение RuntimeException
было бы более подходящим, а расширение IOException
было бы еще лучше, потому что этот вид ошибки может быть вызван действительным пользовательским вводом (т. Е. Вводом имени файла, который существует, но имеет неправильный тип.)
Если проблема в том, что пользователь выбрал файл неправильного типа, то я не думаю, что вы должны позволять коду развиваться так далеко. На самом деле это не похоже на исключение, а скорее путь в программе. Если пользователь выбрал неправильный тип файла, ему следует предложить выбор снова выбрать файл. Очевидно, вам следует ограничить выбор в JFileChooser файлами правильного типа, если это так же просто, как посмотреть на расширение.
Я не думаю, что имеет смысл ловить его в loadfile
. Вы все равно можете написать сообщение в журнал (используйте System.err
), только сделайте это до того, как выбросить исключение. Вы на верном пути к тому, чтобы поймать исключение и сделать что-нибудь с ним (в данном случае снова предложить пользователю).