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

ski*_*ppy 5 java exception stack-trace

我想创建一个例程来执行一些日志记录,执行一些其他操作,然后抛出异常.我希望从许多不同的地方调用这个例程.但是,在此例程中创建异常意味着它们将在其堆栈跟踪中具有此例程.我宁愿堆栈跟踪不报告此实用程序例程.有没有办法在调用者中创建Exception并将其传递给实用程序例程?

public static void die(String message) throws MyException {
  log(message);
  ...
  throw new MyException();
}
Run Code Online (Sandbox Code Playgroud)

对于Perl/Java双语的程序员:我如何使用Java进行carp

ord*_*rig 12

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

请注意,如您所愿,方法"carp"不会出现在堆栈跟踪中.然而,堆栈跟踪的操作只能通过greates care来完成.