2010-09-02 3 views
4

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

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

С уважением,

magggi

+0

Большое спасибо за ваши ответы. – Magggi

ответ

14
for(File f : files){ 
    try { 
     process(f); // may throw various exceptions 
    } catch (Exception e) { 
     logger.error(e.getMessage(), e); 
    } 
} 
+1

+1 для значимого сообщения журнала (включая имя файла). Большинство кода, которые я вижу, имеют только 'logger.info (e.getMessage())'. – Thilo

+1

Это может быть лучший стиль, чтобы не улавливать общий тип исключения, а скорее конкретные типы исключений (IOException, ...). – boutta

+2

Хотя на практике, если вы открываете соединение с файлом, вам нужно добавить блок finally, в котором будет закрываться соединение в соответствии с ответом Colins. – Joel

11

Вы должны использовать TRY/поймать/наконец блоков.

try{ 
    //Sensitive code 
} catch(ExceptionType e){ 
    //Handle exceptions of type ExceptionType or its subclasses 
} finally { 
    //Code ALWAYS executed 
} 
  • try позволит выполнить чувствительный код, который может вызвать исключение.
  • catch будет обрабатывать конкретное исключение (или любой подтип этого исключения).
  • finally поможет выполнить инструкции, даже если исключение выбрано и не выхвачено.

В вашем случае

for(File f : getFiles()){ 
    //You might want to open a file and read it 
    InputStream fis; 
    //You might want to write into a file 
    OutputStream fos; 
    try{ 
     handleFile(f); 
     fis = new FileInputStream(f); 
     fos = new FileOutputStream(f); 
    } catch(IOException e){ 
     //Handle exceptions due to bad IO 
    } finally { 
     //In fact you should do a try/catch for each close operation. 
     //It was just too verbose to be put here. 
     try{ 
      //If you handle streams, don't forget to close them. 
      fis.close(); 
      fos.close(); 
     }catch(IOException e){ 
      //Handle the fact that close didn't work well. 
     } 
    } 
} 

Ресурсы:

+0

Мне это известно. Проблема: 1.My приложение обрабатывает несколько файлов. 2.Возможность сбоя файлов во время обработки (исключение) 3.Но теперь мое приложение завершает работу в случае отказа 1 файла. 4.I хочу, чтобы мое приложение продолжало выполнение других файлов. Так как я должен структурировать обработку исключений? – Magggi

+2

Вы должны поместить всю свою обработку исключений в свой цикл. –

0

просто поймайте экскрипцию, которую он может бросить и ничего не делать с ней; ешьте это, как говорят люди :) Но хотя бы запишите его!

Очень краткий пример:

try { 
    your code... 
} catch (Exception e) { 
    log here 
} 
2

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

Основная предпосылка - блок catch try.

try 
{ 
    //Your code here that causes problems 
} 
catch(exception ex) 
{ 
    //Your code to handle the exception 
} 

Вы пытаетесь использовать свой код, и если возникло исключение, вы «поймаете» его. И делай то, что тебе нужно. Существует также дополнение к блоку catch, в котором вы можете добавить, наконец, {} под ним. В принципе, даже если исключение не создано, код finally все еще выполняется. Вы можете удивиться этому моменту, но его часто используют для управления потоками/файлами и т. Д., Чтобы закрыть поток.

Подробнее об исключениях явы здесь в учебниках, написанных Sun (теперь Oracle) - http://download.oracle.com/javase/tutorial/essential/exceptions/

try 
{ 
    //Your code here that causes problems 
} 
catch(exception ex) 
{ 
    //Your code to handle the exception 
} 
finally 
{ 
    //Always do this, i.e. try to read a file, catch any errors, always close the file 
} 

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

Опять же, это полезная, но важная тема, поэтому вам нужно прочитать об этом.

Поскольку вы делаете несколько файлов, вам нужно в основном выполнить цикл и внутри цикла содержится блок try/catch.

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

0

Как правило, я бы это сделал.

ArrayList<Entry> allEntries = getAllEntries(); 

for(Entry eachEntry:allEntries){ 
    try{ 
    //do all your processing for eachEntry 
    } catch(Exception e{ 
    ignoredEntries.add(eachEntry); 
    //if concerned, you can store even the specific problem. 
    } finally{ 
    //In case of resource release 
    } 
} 

if(ignoredEntries.size() > 0){ 
    //Handle this scenario, may be display the error to the user 
} 
0

FileSystemException может быть конкретным исключением, которого вы ищите.

Хотя, лучшая идея для начинающих, чтобы поймать исключение и напечатать его с помощью

System.out.println(e);

где e является пойманы исключение.

Смежные вопросы