没有办法(不管它有多“黑”)检测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
吗?
正如一些人已经建议的那样,您可以使用自定义的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));
您可以实现自己的类(我称之为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(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变
刚刚安装了Eclipse Luna(4.4标准)。从帮助菜单,安装Aptana插件。重新启动IDE后,我得到以下错误: “启用调试并刷新日志缓存”过程中出现内部错误。org/Eclipse/OSGi/Framework/Internal/Core/FrameworkProperties 看起来环境工作正常,但我每次打开程序都得到错误。 下面是日志: !message在“启用调试和刷新日志缓存”过程