【问题标题】:log4j exception handling problemlog4j 异常处理问题
【发布时间】:2010-10-28 17:36:34
【问题描述】:

我有一个初始化我的 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);
      }

【问题讨论】:

  • 你确定抛出了异常?
  • og4j:ERROR 无法读取配置文件 java.io.FileNotFoundException:(系统找不到指定的文件)在 java.io.FileInputStream.open(本机方法)在 java.io.FileInputStream。 (FileInputStream.java:106) 在 java.io.FileInputStream.(FileInputStream.java:66) 在 org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:316) 在 org.apache.log4j .PropertyConfigurator.configure(PropertyConfigurator.java:342) +log4j:WARN 找不到记录器(根)的附加程序。 log4j:WARN 请正确初始化log4j系统。
  • 是的,事实上,关键是要从中获得一个例外 =)

标签: java exception log4j


【解决方案1】:

你能告诉我,找到问题的答案了吗? 这对我很有用。

我的解决办法是:

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

你有更好的吗? 非常感谢!

【讨论】:

    【解决方案2】:

    为什么你认为当文件不存在时会抛出异常?我只是快速浏览了 API 文档,他们没有说明丢失文件的处理 - 所以很可能会忽略该条件。


    编辑:只需阅读您的附加 cmets,情况并非如此。

    确保静态块实际正在执行。


    编辑:PropertyConfigurator 正在捕获异常,并在内部处理它。这就是为什么你看不到异常。 See the source - lines 370-380.

    【讨论】:

    • java 肯定会在内心深处抛出异常。我知道这个。因为无论他们将使用什么,他们都会使用 java.lang 并且会说 NO FILE!异常和 log4j 打印一个有异常的堆栈跟踪。唯一的问题是我自己无法处理这个并说杀死线程或其他东西。
    • 我检查了静态块是否已执行。
    • 所以你是说打印了一个堆栈跟踪,但是你的代码永远不会抛出异常?这意味着 Log4J 在自己的代码中捕获异常。
    • 迈克,是的 Thread.currentThread().interrupt();。我想我将在我的主线程中编写代码。泰!
    【解决方案3】:

    PropertyConfigurator#configure(String configFilename) 不会抛出任何选中的Exception,因此catch(Exception t) 永远不会捕获任何东西。检查 ApiDoc,因为当您想要捕获异常时,必须在 throws 子句中声明异常。

    【讨论】:

    • 是的,这是我检查的第一件事。没有抛出异常,但 stdout 打印了一个异常。自然是想拍下来对吧?
    • 我猜异常打印到System.err,而不是System.out。然而,如果 java.lang.Exception 未在 throws 子句中声明,您将永远无法捕捉到它。 (尽管有字节码操作)
    【解决方案4】:

    会不会是configure方法报错了?

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

    【讨论】:

    • 我实际上都做了,Catch(Throwable t){} 然后是 catch(Exception e) {} 并且它们都没有被执行。
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2023-03-21
    • 2011-01-18
    相关资源
    最近更新 更多