2010-01-06 3 views
2

Я новичок в исключениях, не освещал их в колледже, но все равно узнал о них. Я пробовал это и, похоже, работал, но не кажется «правильным». Каков правильный способ повторить метод после обработки исключения?Каков правильный способ повторить метод после исключения?

public static void openCSV(String file) { 
    FileInputStream fis; 

    try { 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { //fnf, probably not downloaded yet. 

     downloadCSV(file); //Download it and try again. 

     try { 
      fis = new FileInputStream(file); 
     } catch (FileNotFoundException e) { 
      // OK, something else is the problem. 
     } 
    } 
} 

ответ

2

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

попробовать что-то вроде этого:

public static void openCSV(String file) { 
    FileInputStream fis; 

    try { 
     if (!(new File(file).exists())) { 
      downloadCSV(file); //download it 
     } 
     fis = new FileInputStream(file); 
     // should probably use the stream here, so you can close it in a finally clause linked to this try clause... 
    } catch (FileNotFoundException e) { //file doesnt exist 
     // Re-throw as a declared exception, a RuntimeException, and/or log it... 
    } finally { 
     if (fis != null) { 
      try { 
       fis.close(); 
      } catch (IOException ioe) { 
       // write exception to logs or take other appropriate action... 
      } 
     } 
    } 
} 
+1

'fis.close()' должен находиться в другом блоке 'try/catch'. – BalusC

+0

BalusC верен. изм. –

0

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

Вы можете просто проверить, существует ли файл в первый раз, а затем попытаться его загрузить.

4

Ваш вопрос не касается «исключений», но в большей степени касается дизайна в целом. Вы получите много, много мнений о правильном способе справиться с этим.

Наиболее очевидным исправление

if (!new File(file).exists()) { 
    downloadCSV(file); 
} 
try { 
    fis = new FileInputStream(file); 
} catch (IOException e) { 
    // scream 
} 
+1

Обратите внимание, что 'файл' является' String' его случае. Сначала ему нужно будет создать «Файл». – BalusC

+0

Большое спасибо, BalusC. Ред. –

+0

Не забудьте также предупредить о потенциальных проблемах с относительными путями;) +1. – BalusC

2

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

public static void openCSV(String file) { 
    FileInputStream fis; 

    if (!(new File(file).exists())) { 
     downloadCSV(file); //download it and try again 
    } 

    try { 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     // ok something else is the problem; 
    } 
} 
0

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

1

Возможно, вы должны позвонить по номеру downloadCSV(file); за пределами openCSV(file). Если исключено FileNotFoundException исключение, вы должны повторно отправить вызывающему абоненту. Вы также должны использовать блок finally для закрытия потока.

0

Я не вижу проблемы с кодом. (Кроме того, я бы поставил его по-своему, не использовал составленные аббревиатуры, такие как fis; openCSV должен, вероятно, выбросить исключение и, вероятно, не должен быть статическим.)

Очевидная причина, по которой вы не хотите для использования File.exists состоит в том, что две операции по пути к файлу не будут атомарными. Это обычная проблема с файловыми операциями. Держите вещи как можно больше (обратите внимание, что это работает против «делать только одно»). Две операции также могут быть медленнее, чем одна.

File.exists Возможно, вы не сможете определить, существует или нет файл. Возможно, у вас нет прав на чтение каталога, например (минимальные разрешения - это хорошо).