Где обработать Исключение

Я в настоящее время работаю над проектом, и я натолкнулся на что-то вроде главного скребка. Я программировал в 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, и таким образом это может быть вводящее в заблуждение ошибочное имя. Данный файл может иметь в значительной степени любое расширение, это - содержание этого, должен быть хорошо сформирован.

8
задан Chris Salij 9 February 2010 в 20:41
поделиться

6 ответов

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

  1. Проверьте тип файла и предупредите пользователя, если тип файла недействителен, через стандартный поток управления. Вы можете рассмотреть статический метод в WikiGraph, например IsFileValid (filename)
  2. При инициализации WikiGraph выбросить исключение, если тип файла недопустим.

Этот подход дает вам лучшее из обоих миров - у вас есть возможность предупреждать пользователей о предоставлении неверных данных, при этом обеспечивая с точки зрения WikiGraphs точность предоставленной информации. Это дает разработчикам, работающим с WikiGraph, возможность убедиться, что их ввод действителен, без необходимости обработки исключений.

4
ответ дан 5 December 2019 в 17:37
поделиться

Попробуйте избежать его, звездочка является специальным символом в 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) может быть разрешен в форме пользовательского ввода, чтобы избежать ненужного перехода к уровню службы файловой системы.

0
ответ дан 5 December 2019 в 17:37
поделиться

Одним из основных преимуществ исключений является то, что они предоставляют вам удобные средства обработки исключения вдали от места его возникновения. В языках, которые его не поддерживают, вам пришлось бы каждый вызов на пути проверять возвращаемое значение, break и return, чтобы вы выполняли распространение вручную.

Имеет смысл обработать исключение, если вы чувствуете, что можете либо восстановить его, либо лучше всего сообщить об этом и отменить операцию.

Насколько я понимаю, взаимодействие начинается с ввода пользовательского интерфейса и что, если тип файла несоответствующий, вы не сможете восстановить его. Следовательно, у меня была бы любая задача пользовательского интерфейса, которая инициировала открытие файла, перехватывала исключение, сообщала пользователю о возникшей ошибке и либо отменяла, либо запрашивала другой ввод.

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

3
ответ дан 5 December 2019 в 17:37
поделиться

Я думаю, что это тип ситуации, для которой предназначены проверенные исключения (согласны вы с ними или нет). Я полагаю, IncorrectFileTypeError расширяет Ошибка ? Расширение RuntimeException было бы более подходящим, а расширение IOException было бы еще лучше, потому что этот вид ошибки может быть вызван действительным пользовательским вводом (т. Е. Вводом имени файла, который существует, но имеет неправильный тип.)

1
ответ дан 5 December 2019 в 17:37
поделиться

Если проблема в том, что пользователь выбрал файл неправильного типа, то я не думаю, что вы должны позволять коду развиваться так далеко. На самом деле это не похоже на исключение, а скорее путь в программе. Если пользователь выбрал неправильный тип файла, ему следует предложить выбор снова выбрать файл. Очевидно, вам следует ограничить выбор в JFileChooser файлами правильного типа, если это так же просто, как посмотреть на расширение.

1
ответ дан 5 December 2019 в 17:37
поделиться

Я не думаю, что имеет смысл ловить его в loadfile. Вы все равно можете написать сообщение в журнал (используйте System.err), только сделайте это до того, как выбросить исключение. Вы на верном пути к тому, чтобы поймать исключение и сделать что-нибудь с ним (в данном случае снова предложить пользователю).

1
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: