【问题标题】:Apply a listener to System.err?将侦听器应用于 System.err?
【发布时间】:2019-02-08 12:51:14
【问题描述】:

我有这样的想法,即每当我的 JavaFX 程序中发生未处理的异常时,我可以向用户显示警报,而不是依赖控制台输出。我在想也许我可以捕获 System.err 的输出来使用。这是我迄今为止尝试过的。

    PrintStream myStream = new PrintStream(System.err) {
        @Override
        public void println(String s) {
            super.println(s);
            Log.debugLog(s); //this function logs to a file and displays an alert to user
        }
    };
    System.setErr(myStream);

如果我将 System.err 替换为 System.out,并将 System.setErr 替换为 System.setOut,则此代码段有效。然而,这是捕获 System.out,而不是 System.err. 我想更好的问题是,在向控制台显示错误时 System.err 调用的确切函数是什么?所以这可能会覆盖它。任何提示表示赞赏。

【问题讨论】:

  • 将方法调用包装在try-catch 中并完成
  • 是什么让你觉得它不起作用?更改为err 流后尝试调用System.err.println("foobar")
  • 相关的,甚至可能是重复的:stackoverflow.com/questions/13841884/…(您可以扩展FilterOutputStream 以将输出保留在System.err。)但是这样您就不能确定错误是否在给定的情况下完全打印时间。调用的确切顺序是您不应该依赖的实现细节。
  • 您的代码将在您调用时满足您的需求:System.err.println("foobar") 而不是System.out.println("foobar")

标签: java exception javafx error-handling exception-handling


【解决方案1】:

我认为你的方法有误。如果您想在出现未处理的异常时向用户显示警报,您可以通过设置 DefaultUncaughtExceptionHandler 来实现:

Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
       // show alert to user
       e.printStackTrace();
       // do whatever you want with the Exception e

    });

【讨论】:

  • 太棒了,这正是我要找的。现在,如果我想获取 e.printStackTrace() 将输出的内容,我在 e 上调用什么方法?具体来说,我想知道哪一行代码失败了。我试过e.getMessage()、e.fillInStackTrace().toString(),好像搞不明白。
  • 阅读此处了解如何获取行号:stackoverflow.com/questions/23903831/… 如果我的回答解决了您的问题,请将其标记为正确。
【解决方案2】:

您可以创建自定义的 JavaFX 警报,以显示异常堆栈跟踪以及简短消息。这个link 显示了下面的代码。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2013-09-24
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多