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

标签 java exception stack-trace

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

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/

相关文章:

java - Jetty 8 HTTPClient 支持进行 Comet HTTP 连接吗?

iOS应用程序退出而没有日志

java - 如何使用索引获取 linkedhashmap 值?

java - 填充构建器类,然后从中创建一个 json 字符串

c++ - 异常机制不起作用

java - 堆栈跟踪中包含 Lombok 构建器的异常

JavaScript 权限被拒绝。不跨域?

javascript - 如何在 Node.js 中打印堆栈跟踪?

java - 如何将堆栈跟踪添加到 soap 错误 (websphere)

java - 将 Apache Orc 文件列名与列统计信息相匹配