2010-10-28 127 views
1

我有一個類初始化我的log4j。此代碼將永遠不會打印或退出,我不明白爲什麼。log4j異常處理問題

public class MyLog 
{ 

    private static Logger log; 

    static 
    { 
     log = Logger.getRootLogger(); 
     try 
     { 
      PropertyConfigurator.configure("somefileNameWhichDoesNotExist"); 
     } 
     catch(Exception t) 
     { 
      System.out.println("oops logging cant be set, lets exit"); 
      System.exit(0); 
     } 
+0

您確定會拋出異常? – kukudas 2010-10-28 17:39:45

+0

og4j:錯誤無法讀取配置文件 java.io.FileNotFoundException:(系統找不到指定的文件)在java.io.FileInputStream中 \t在java.io.FileInputStream.open(本機方法) \t。 (FileInputStream.java:106) \t at java.io.FileInputStream。 (FileInputStream.java:66) \t在org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:316) \t在org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:342) + log4j的: WARN記錄器(root)沒有找到appender。 log4j:WARN請正確初始化log4j系統。 – Krolique 2010-10-28 17:42:37

+0

是的,其實整個問題是從這個=) – Krolique 2010-10-28 17:43:04

回答

2

爲什麼你認爲文件不存在時會拋出異常?我只是快速瀏覽了API文檔,他們沒有提到處理丟失文件的任何信息 - 所以這種情況可能會被忽略。


編輯:只是閱讀你的額外意見,所以情況並非如此。

確保靜態塊實際上正在執行。


編輯:PropertyConfigurator捕捉異常,並在內部處理它。這就是爲什麼你沒有看到例外。 See the source - lines 370-380

+0

java肯定會在某處深處發生異常。我知道這個。因爲不管他們將使用什麼,他們將使用java.lang,並會說沒有文件!異常和log4j打印一個堆棧跟蹤,有例外。唯一的問題是我不能自己處理這個問題,並說殺死線程什麼的。 – Krolique 2010-10-28 17:48:16

+0

我檢查了執行的靜態塊。 – Krolique 2010-10-28 17:49:39

+1

所以你說打印了一個堆棧跟蹤,但這個異常永遠不會被拋到你的代碼中?這意味着Log4J正在捕獲它自己代碼中的異常。 – 2010-10-28 17:56:24

0

難道配置方法會拋出Error嗎?

更改您的代碼以捕獲java.lang.Throwable(http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html)而不是Exception。

+0

得到一個例外,我實際上都做了,Catch(Throwable t){}後面跟着catch(Exception e){}並且他們都執行完了。 – Krolique 2010-10-28 17:45:40

1

PropertyConfigurator#configure(String configFilename)不會拋出任何檢查Exception,因此沒有什麼可以趕上catch(Exception t)。檢查ApiDoc,因爲在throws-clause中必須存在一個聲明的異常,以便捕獲異常。

+0

是的,這是我查過的第一件事。沒有發生異常,但stdout打印出一個異常。當然,我想捕捉它,對吧? – Krolique 2010-10-28 19:51:11

+0

我想這個異常是打印到'System.err',而不是'System.out'。儘管如此,如果它沒有在throws子句中聲明,你永遠不會捕獲java.lang.Exception。 (儘管有字節碼操作) – 2010-10-29 18:38:19

0

你能告訴我,找到了問題的答案嗎? 這對我來說非常有用。

我的解決辦法是:

try 
{ 
    Properties props = new Properties(); 
    props.load(new FileInputStream(propFilePath)); 
    PropertyConfigurator.configure(props); 
} 
catch (FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 

可能是你有一個更好的? 非常感謝!