首页 > 解决方案 > 拦截被捕获的异常

问题描述

过多的咖啡因导致了这一点。是的,您实际上可以抓住它,但要开玩笑。

public class GreasedUpDeafGuy extends RuntimeException {

    public GreasedUpDeafGuy() {
        super("You Can't Catch Me!");
    }

    @Override
    public void printStackTrace() {
        throw this;
    }
}

纯粹作为一个思想实验,有什么方法可以吸引“捕获”吗?

try {
    throw new GreasedUpDeafGuy(); // This line itself is creepy
}
catch(GreasedUpDeafGuy e) {} // <-- How could one hook in to this call? 

这样一个狡猾的开发人员可以继续抛出这个异常吗?一位朋友建议堆栈构建可能是拦截的地方,但我们无法弄清楚如何。有人假设 Java 可以保护自己免受这种白痴的影响,但我的目标是成为最大的白痴。

我并不是说 Exception 类本身可以做到这一点。调用“catch”时,不会调用异常中的任何方法。

我们必须更深入。

标签: java

解决方案


将其全部包装在另一个 try catch 块中,例如:

try
{

try
{
     // more caffeine stuff
}catch(GreasedUpDeafGuy inner){inner.printStackTrace();}
}catch(GreasedUpDeafGuy outter){
 for (StackTraceElement stackTraceElement : outter.getStackTrace()) {
            System.out.println(stackTraceElement.toString());
        }}

并且如果看起来很多方法只用于具有此异常的 catch 块中。

但是如果你真的想让异常被捕获两次,则在构造函数中抛出外部异常,所以你只想依赖一个方法。


推荐阅读