在发生错误后将错误消息存储在字符串中 java?



错误发生后,我需要将错误消息存储在字符串中。我无法使用 try 和 catch 块,因为运行初始代码后会出现错误。

在我使用以下代码将错误消息存储在出现时的文件之前:

PrintStream printS = new PrintStream("file.txt");  
System.setErr(pst);

但是我想存储它和一个字符串,并在发生错误后将这个字符串发送到其他地方。我已经尝试使用字节数组输出流:

ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
PrintStream printS = new PrintStream(byteArray);  
System.setErr(pst);
String tester = byteArray.toString(StandardCharsets.UTF_8);

但是当我尝试打印字符串时,它是空的并且不包含错误。有谁知道如何在发生错误后运行代码,以便我可以将此错误消息发送到其他地方?

Java 只是在现场运行代码,你并没有为将来定义触发器。您正在创建一个新的空字节数组输出流,将其设置为以后任何System.err调用的"目标",然后立即将其转换为字符串。当然,此时它仍然是空白的。

你想要的非常复杂 - 你必须编写一个自定义的PrintStream来保存发送给它的任何内容,直到它"看到"一个换行符然后采取行动。像这样:

OutputStream myCustomReportingStream = new OutputStream() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@Override public void write(int b) {
if (b == 'r') continue;
if (b == 'n') {
process(new String(buffer.getBytes(), StandardCharsets.UTF_8));
buffer.reset();
} else {
buffer.write(b);
}
}
private void process(String message) {
// YOUR CODE HERE
}
};
System.setErr(new PrintStream(myCustomreportingStream, true, StandardCharsets.UTF_8));

这里正在发生很多事情:

  • 我们正在定义一个自定义 OutputStream,它会缓冲发送给它的所有内容,直到它看到n(在 ASCII、UTF-8 和许多其他编码中是"换行符"),此时它将缓冲区转换为字符串,将该字符串发送到process方法,并清除缓冲区。它还忽略r来处理rn即窗口样式换行符。

  • 然后,
  • 我们使用该输出流作为新打印流的基础,然后设置 syserr 以使用此打印流。

  • 此代码不处理将数据发送到 System.err 但不发送换行符的任何内容。

  • 任何人随时随地运行System.err.println,您的process()方法都将运行。

相关内容

最新更新