gpt4 book ai didi

java - 如何从调用者的范围抛出异常?

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:37 25 4
gpt4 key购买 nike

我想创建一个例程来执行一些日志记录、执行一些其他操作,然后抛出异常。我希望从许多不同的位置调用此例程。但是,在此例程中创建异常意味着他们将在堆栈跟踪中包含此例程。我宁愿堆栈跟踪不报告此实用程序。有没有一种方法可以在不在调用者中创建异常并将其传递给实用程序的情况下执行此操作?

public static void die(String message) throws MyException {
log(message);
...
throw new MyException();
}

对于会 Perl/Java 双语的程序员:我如何在 Java 中鲤鱼

最佳答案

您可以设置要抛出的任何异常的堆栈跟踪:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CarpTest {
public static void main(String[] args) {
new CarpTest().run();
}

public void run() {
methodThatCarps();
}

private void methodThatCarps() {
carp("Message");
}

private void carp(String message) {
RuntimeException e = new RuntimeException(message);
e.fillInStackTrace();
List<StackTraceElement> stack = new ArrayList<StackTraceElement>(Arrays.asList(e.getStackTrace()));
stack.remove(0);
e.setStackTrace(stack.toArray(new StackTraceElement[stack.size()]));
throw e;
}
}

这将在运行时打印以下堆栈跟踪:

Exception in thread "main" java.lang.RuntimeException: Message
at CarpTest.methodThatCarps(CarpTest.java:18)
at CarpTest.run(CarpTest.java:14)
at CarpTest.main(CarpTest.java:10)

请注意,如您所愿,方法“carp”不会出现在堆栈跟踪中。然而,堆栈跟踪的操作应该非常小心。

关于java - 如何从调用者的范围抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727628/

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