2013-10-03 29 views
0

有时我在摆弄ASM框架。我只想捕捉异常。我可以在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现在),而不是我想只有当它与MethodVisitor方法签名的exception参数匹配扔。

我试图这么做,但得到了Falling off the end of the code类验证错误。

可以使用ASM吗?

在此先感谢。

回答

1

您可以这样做,我建议您在Java和ASMifier中编写您想要的字节代码以查看它的结构。

有一个用于IDE的ASM插件,使其更容易。

+0

是的,ASMifier是伟大的 – omainegra

0

您的代码片段所提供的信息太少,无法真正做到。你说你只想在一定的条件下(重新)抛出异常,但是你没有说明你想做什么。这与验证器错误完全匹配:如果在特定条件下跳过抛出指令,并且未提供方法的替代端点,则代码将从方法的末尾落下。你必须为这种情况提供代码,例如控制回报。另一种方法是不要捕获不符合标准的异常,但会导致与重新抛出所有异常相同的行为。

相关问题