Где обрабатывать исключение - PullRequest
8 голосов
/ 09 февраля 2010

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

В моей текущей ситуации у меня есть основной метод, который инициализирует класс

WikiGraph wiki = wiki = new WikiGraph(getFile());

Конструктор Wikigraph берет имя файла, которое я получаю через DialogBox в методе getFile().

Затем конструктор для wikigraph вызывает метод с именем loadfile(filename), который пытается загрузить и проанализировать данный файл.

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

Ответы [ 6 ]

4 голосов
/ 09 февраля 2010

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

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

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

3 голосов
/ 09 февраля 2010

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

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

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

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

1 голос
/ 09 февраля 2010

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

1 голос
/ 09 февраля 2010

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

1 голос
/ 09 февраля 2010

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

0 голосов
/ 09 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...