有时,我正在摆弄ASM框架。我只是想捕捉异常。
到目前为止,我能够在字节码中插入try-catch
块并捕获异常。
这就是我现在正在做的事情。
public void visitMaxs(int maxStack, int maxLocals)
{
// visit try block end label
this.visitLabel(lblTryBlockEnd);
// visit normal execution exit block
//this.visitJumpInsn(Opcodes.GOTO, exitBlock);
// visit catch exception block
this.visitLabel(lblCatchExceptionBlockStart);
// store the exception
this.visitVarInsn(Opcodes.ASTORE, 1);
super.visitTypeInsn(Opcodes.NEW, "java/lang/Exception");
super.visitInsn(Opcodes.DUP);
// load the exception
this.visitVarInsn(Opcodes.ALOAD, 1);
// Initializing the exception object with the throwable cause
super.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Exception", "<init>", "(Ljava/lang/Throwable;)V");
// calling jensor method to write
super.visitMethodInsn(Opcodes.INVOKESTATIC,
"test/ExceptionHandleTest",
"exceptionHandler",
"(Ljava/lang/Exception;)V");
// call printStackTrace()
this.visitInsn(Opcodes.ATHROW);
// exit from this dynamic block
this.visitLabel(exitBlock);
super.visitMaxs(maxStack+2, maxLocals);
}
`
现在,我不想抛出每个捕获的异常(因为我现在每次都在执行athrow
),而只是当它与exception
方法签名MethodVisitor
参数匹配时才想抛出{1}}。
我试图这样做,但得到Falling off the end of the code
类验证错误。
是否可以使用ASM?
提前致谢。
答案 0 :(得分:1)
你可以这样做,我建议你在Java和ASMifier中写下你想要的字节代码,看看它是如何构建的。
IDE有一个ASM插件,可以让这更容易。
答案 1 :(得分:0)
您的代码片段提供的信息太少,无法确切地说明您的实际操作。你说你想要(重新)在特定条件下抛出异常,但你没有说出你想做什么。这完全匹配验证程序错误:如果在某些条件下跳过throw指令并且没有提供方法的替代结束,则代码将脱离方法的末尾。您必须为该案例提供代码,例如受控制的回报。另一种方法是不捕获不符合您标准的异常,但最终会导致与重新抛出所有异常相同的行为。