记录e.printStackTrace内容

本文介绍了如何在Java中捕获异常并使用printStackTrace方法将堆栈信息保存到String对象,以便在需要时灵活使用。通常,异常会默认输出到System.err,但通过printStackTrace(PrintWriter pw)可以将信息输出到指定的PrintWriter,例如StringWriter,从而存储在内存中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候需要记录异常打印e.printStackTrace的内容,可以使用下面的写法

	try {
		//业务代码
	}catch (Exception e){
		try{
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			e.printStackTrace(pw);
			log.debug(sw.toString());
			pw.close();
			sw.close();
		}catch (Exception e1){
			e1.printStackTrace();
		}
	}

/以下是相关扩展*****/

参考:https://blog.youkuaiyun.com/huangyangquan/article/details/78173141
如果你遇到一个情景是你必须使用一个Reader或者Writer来作为参数传递参数,但你的数据源又仅仅是一个String类型数据,无需从文件中写出,那么此时就可以用到它们。并且值得注意的是StringWriter中,写入的数据只是存在于缓存中,并不会写入实质的存储介质之中。
StringReader和StringWriter

package net.nyist.io;
 
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
 
public class StringNodeTest {
	public static void main(String[] args) {
		String src = "从明天起,做一个幸福的人,\n喂马,劈材,周游世界,\n从明天起,关心粮食和蔬菜,\n我有一所房子,面朝大海,春暖花开,\n从明天起,和每一个人通信,告诉他们我的幸福\n";
		char[] buffer = new char[32];
		int hasRead = 0;
		try(
				StringReader sr = new StringReader(src);
				){
			//采用循环读取的方式,读取字符串
			while((hasRead  = sr.read(buffer))> 0 ){
				//
				System.out.println(new String(buffer,0,hasRead));
			}
		}catch(IOException ioe){
			ioe.printStackTrace();
		}
		try(
				//
				StringWriter sw = new StringWriter();
				){
			//调用方法执行输出
			sw.write("有一个美丽的新世界\n");
			sw.write("有一个美丽的新世界\n");
			sw.write("有一个美丽的新世界\n");
			sw.write("有一个美丽的新世界\n");
			sw.write("有一个美丽的新世界\n");
			System.out.println(sw.toString());
		}catch(IOException ioe){
			ioe.printStackTrace();
		}
	}
}

参考:https://blog.youkuaiyun.com/yuhua3272004/article/details/2775881
在Java中,利用try…catch(…finally)语句可以捕获和处理异常,非常方便。catch块的常见异常处理方式是输出异常,例如把异常输出到日志文件。

Exception类有一个printStackTrace()方法,它能够从发生异常的方法中输出堆栈信息,默认输出位置是System.err。但是,有时候我们要把堆栈信息输出到System.err之外的其他地方,例如在出现异常时把堆栈信息输出到email,或者用一个对话框显示出来。

printStackTrace()方法有几种不同的类型:

· printStackTrace(),输出到标准错误流。

· printStackTrace(PrintStream ps),输出到名为ps的PrintStream。

· printStackTrace(PrintWriter pw),输出到名为pw的PrintWriter。

我们可以用最后一种printStackTrace()方法把堆栈信息保存到String对象。只要在String对象中捕获了堆栈信息,我们就可以方便地在应用的任何地方使用这些信息了。下面的代码片断示范了具体的实现步骤

private String getStackTraceAsString() {
    // StringWriter将包含堆栈信息
    StringWriter stringWriter = new StringWriter();
    //必须将StringWriter封装成PrintWriter对象,
    //以满足printStackTrace的要求
    PrintWriter printWriter = new PrintWriter(stringWriter);
    //获取堆栈信息
    e.printStackTrace(printWriter);
    //转换成String,并返回该String
    StringBuffer error = stringWriter.getBuffer();
    return error.toString();
}
### 关于 `e.printStackTrace()` 的用法及其目的 `e.printStackTrace()` 是 Java 中用于调试的一种方法,它会将异常对象的信息打印到标准错误流 (通常是控制台)[^3]。此方法的主要作用是帮助开发者快速定位程序中的错误位置以及错误的原因。 以下是关于该方法的一些重要细节: #### 方法功能描述 当抛出一个异常时,调用 `e.printStackTrace()` 可以显示完整的堆栈跟踪信息,包括引发异常的方法链路、文件名和具体行号[^4]。这对于理解程序运行过程中发生的具体问题非常有帮助。 ```java try { // Some code that may throw an exception } catch (Exception e) { e.printStackTrace(); // Print the stack trace of the caught exception } ``` 上述代码片段展示了如何捕获并处理可能发生的异常,并通过 `printStackTrace()` 输出详细的错误日志。 #### 替代方案 尽管 `e.printStackTrace()` 对开发阶段很有价值,但在生产环境中通常不推荐使用这种方法记录错误信息。更常见的做法是利用专业的日志框架(如 Log4j 或 SLF4J),它们提供了更加灵活的日志管理能力[^5]。 例如采用 Logger 记录同样的异常信息可以这样实现: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExampleClass { private static final Logger logger = LoggerFactory.getLogger(ExampleClass.class); public void exampleMethod() { try { // Code which might cause exceptions. } catch (Exception ex) { logger.error("An error occurred", ex); // Use logging instead of printStackTrace() } } } ``` 这里引入了一个名为 `Logger` 的实例来替代原始的 `printStackTrace()` 调用方式,从而增强了应用程序可维护性和扩展性。 #### 解决与证书验证失败有关的问题 针对提到的 `sun.security.validator.ValidatorException: PKIX path building failed:` 错误情况,这表明当前 JVM 无法构建一条可信的有效认证路径至目标服务器所指定的目标实体。此类问题一般源于缺少必要的 CA 根证书或者配置不当的信任库设置等问题[^2]。 要解决这个问题,可以通过导入正确的根证书到本地 JDK/JRE 安装目录下的 cacerts 文件中完成信任关系建立过程;另外也可以考虑调整 SSL/TLS 验证逻辑绕过严格校验机制作为临时解决方案之一,不过后者存在安全隐患需谨慎对待。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值