gpt4 book ai didi

java - 我可以实例化一个异常并保留它以备后用,并避免 coSTLy 堆栈跟踪(如果它从未抛出)吗?

转载 作者:行者123 更新时间:2023-11-30 07:13:38 25 4
gpt4 key购买 nike

我正在考虑使用它的情况是在多线程应用程序中。假设我的主线程(我们称之为 Prime)需要启动另一个线程(我们称之为 Daemon)在后台执行某些操作。

Daemon 线程可以从 Prime 线程中的多个不同位置启动,如果 Daemon 线程遇到错误,我想知道 Prime 线程中的哪一段代码最初启动了失败的 Daemon 线程。

所以假设在 Prime 线程中我创建了一个 new Exception("some message") ,将其交给Daemon线程(例如在其构造函数中),然后启动Daemon线程。

如果守护进程执行时没有错误,则永远不会使用异常,并且我希望避免支付跟踪堆栈的成本。

另一方面,如果守护进程发生异常,我希望它能够使用来自 Prime 线程的异常以及守护进程自己的异常来帮助调试。来自 Prime 线程异常的堆栈跟踪将指示在何处生成守护进程,来自守护进程的堆栈跟踪将指示在守护进程中的何处遇到问题。

如果我这样做,我是否需要为每种情况支付 Prime 线程的 Exception 的处理成本,或者只是 Daemon 线程遇到错误并随后查看 Prime 线程的 Exception 堆栈的情况?

最佳答案

异常的堆栈跟踪在构造异常时填充。如果您查看 java.lang.Throwable 的构造函数,它们都会看起来 something like :

public Throwable() {
fillInStackTrace();
}

public Throwable(String message) {
fillInStackTrace();
detailMessage = message;
}

等等。其中 fillInStackTrace() 是构建堆栈跟踪的方法。所以是的,无论是否抛出,您都必须支付堆栈跟踪构造的成本。

但是,我预计构建线程的成本会大得多。

关于java - 我可以实例化一个异常并保留它以备后用,并避免 coSTLy 堆栈跟踪(如果它从未抛出)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38776308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com