当前位置: 首页 > 知识库问答 >
问题:

检测写入标准错误流

穆承运
2023-03-14

没有办法(不管它有多“黑”)检测Java的系统。err已写入,以便在发生这种情况时能够执行逻辑?-我目前正在使用线程(我们称之为吞咽线程)的一个自定义子类,它在线程的实现中吞咽了大量异常。以类似于以下代码的方式运行()

public final class SwallowingThread extends Thread {

    ...

    @Override
    public void run() {
        ServerSocket socket = new ServerSocket(80, 100);
        try {
            Socket connected = socket.accept();
            // Do stuff with socket here
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然而,在我的代码中,我希望能够处理在使用吞咽线程实例时发生的未知后异常IOException;是否无法在发生这种捕获和打印错误后检测到其是否为标准错误?-我最初尝试编写一个UncaughtExceptionHandler来执行此操作,结果发现它没有捕获异常,因为它们被吞没了,而不是简单地被包装在RuntimeException中并向前抛出。

当然,解决这个问题的一个“更好”的方法是重新编写类的逻辑,但是没有快速而肮脏的方法来解决这个问题而不必触摸SwallowingThread吗?


共有2个答案

钮誉
2023-03-14

正如一些人已经建议的那样,您可以使用自定义的PrintStream

它将替换标准错误流,但也会封装它,并在需要时调用它。

由于您感兴趣的是异常和堆栈跟踪,所以覆盖print(String)应该足够了(println(String)已经调用了这个方法newLine())。

溪流可能是这样的:

import java.io.PrintStream;

public class CustomPrintStream extends PrintStream {


    public CustomPrintStream(final PrintStream out) {

        super(out);

    }

    @Override
    public void print(final String s) {

        super.print(s);
        // some String is written to the error stream, Do something !

    }

}

你可以这样使用它,在应用程序开始时,只需调用

System.setErr(new CustomPrintStream(System.err));
邢烨烨
2023-03-14

您可以实现自己的类(我称之为DelegatingErrorPrintStream),该类派生自PrintStream,它会通知您是否有新的输出,然后委托给系统。错误,现在您可以将DelegatingErrorPrintStream设置为系统的输出流。错误使用系统。setErr(err);

完整示例包括用法:

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

public class ErrorNotifierExample {
private static final class ErrorDelegatingPrintStream extends PrintStream {
    public ErrorDelegatingPrintStream(PrintStream defaultErr)
            throws FileNotFoundException, UnsupportedEncodingException {
        super(defaultErr);
    }

    @Override
    public void print(boolean b) {
        super.print(b);
        notifyListener(b);
    }

    @Override
    public void print(char c) {
        super.print(c);
        notifyListener(c);
    }

    @Override
    public void print(int i) {
        super.print(i);
        notifyListener(i);
    }

    @Override
    public void print(long l) {
        super.print(l);
        notifyListener(l);
    }

    @Override
    public void print(float f) {
        super.print(f);
        notifyListener(f);
    }

    @Override
    public void print(double d) {
        super.print(d);
        notifyListener(d);
    }

    @Override
    public void print(char[] s) {
        super.print(s);
        notifyListener(s);
    }

    @Override
    public void print(String s) {
        super.print(s);
        notifyListener(s);

    }

    @Override
    public void print(Object obj) {
        super.print(obj);
        notifyListener(obj);

    }

    @Override
    public PrintStream append(CharSequence csq, int start, int end) {
        notifyListener(csq); // TODO will need some special handling
        return super.append(csq, start, end);
    }

    private void notifyListener(Object string) {
        // TODO implement your handling here. System.out printing is just an
        // example.
        System.out.println(String.valueOf(string));
    }
}

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
    ErrorDelegatingPrintStream errReplacement = new ErrorDelegatingPrintStream(System.err);
    System.setErr(errReplacement);

    System.err.println("TEST01");
    throw new RuntimeException("just a test output for ERROR handling");
}
}
 类似资料:
  • 1.1.1. 驱动错误代码 1.1.1. 驱动错误代码 标准错误 E_DRIVER_ERROR 通用错误 E_INVALID_AUTHORIZATION 授权非法,并且不应该继续使用、刷新 E_DRIVER_SIGN_ERROR 签名错误(Token 超时时使用)提醒用户去 App 授权 E_DRIVER_DEVICE_NO_FOUND 设备不存在 E_DRIVER_TIMEOUT 设备控制超时

  • 10.2. 标准输入、输出和错误 UNIX 用户已经对标准输入,标准输出和标准错误的概念非常熟悉了。这一节是为其他不熟悉的人准备的。 标准输入和标准错误(通常缩写为 stdout 和 stderr)是內建在每一个 UNIX 系统中的管道。当你 print 某些东西时,结果前往 stdout 管道;当你的程序崩溃并打印出调试信息(类似于 Python 中的错误跟踪)的时候,信息前往 stderr 管

  • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

  • 问题内容: 我正在向stdin写入大量数据。 我如何确保它不会阻塞? 我读了一个大字符串并将其写入后,似乎无法解决。 我有大量的文件集,这些文件将被顺序写入stdin(> 1k个文件) 所以发生的事情是我正在运行一个循环 它以某种方式挂在文件号上。400.该文件是带有长字符串的大文件。 我确实怀疑这是一个阻碍性问题。 仅当我从0迭代到1000时才会发生这种情况。但是,如果我要从文件400开始,则不

  • 问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变

  • My mechanic told me, I couldn’t repair your brakes, so I made your horn louder. — Steven Wright 通常,当出现问题时,我们会在继续运行前先停止它并修复错误。然而, 当以守护进程模式运行时,Puppet 会忽略配置清单的编译错误, 仅从缓存中应用最近一次已知可运行的版本。这个行为是由 usecacheonf