2010-09-02 182 views
4

即使處理一組文件中的某些文件時發生異常,我如何使用異常和異常處理來使我的程序繼續運行?Java異常處理

我希望我的程序能正常工作,而對於那些在程序中導致異常的文件,它應該忽略。

問候,

magggi

+0

非常感謝您的回答。 – Magggi 2010-09-02 17:51:40

回答

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 2010-09-02 09:34:04

+1

不捕獲一般Exception類型,而是捕獲特定異常類型(IOException,...)可能會更好。 – boutta 2010-09-02 09:34:13

+2

儘管在實踐中,如果打開文件連接,您將需要添加一個finally塊,以便根據Colins的回答關閉連接。 – Joel 2010-09-02 09:35:51

11

你不得不使用的try/catch /終於集團。

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.我的應用程序處理多個文件。 (例外) 3.但現在我的應用程序退出任何1個文件失敗。 4.我想我的應用程序繼續執行其他文件。那麼我應該如何構建我的異常處理? – Magggi 2010-09-02 09:22:46

+2

你應該把你所有的異常處理放在循環中。 – 2010-09-02 09:30:22

0

只是抓住了它可能拋出的異想天開而無所作爲;像人們說的那樣吃它:) 但是至少要登錄它!

非常簡潔例如:

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

我猜你的新的編程爲execeptions是一個相當fundermental概念,問題可能發生在你的控制,你需要處理它。

基本前提是try catch塊。

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

您'嘗試'您的代碼,並且如果引發異常,您'捕捉'它。並做你需要的。 此外還有一個catch塊,您可以在其下面添加{}。基本上,即使沒有引發異常,最終的代碼仍然運行。您可能想知道這一點,但它經常用於流/文件處理等來關閉流。

瞭解更多關於Java異常在這裏由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 
} 

你可能會問是怎麼做的,你捕獲不同的例外,即它是一個空引用,是它的問題除以零,找不到文件或文件不可寫入等。爲此,您可以在try下編寫幾個不同的catch塊,基本上每種類型的異常都有一個catch,使用「exception」基本上就是catch all語句,就像在if語句堆棧中一樣,如果「exception」是第一個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是捕捉到的異常打印。