2013-10-03 5 views
0

때로는 ASM 프레임 워크를 만지작 거리고 있습니다. 나는 단지 예외를 잡기를 원한다.ASM에서 메소드 서명을 기반으로 예외를 throw 할 수 있습니까?

지금까지 바이트 코드에 try-catch 블록을 삽입하고 예외를 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); 

    } 
` 

지금, 내가 대신 나는 그것이 MethodVisitor 방법 서명의 exception 매개 변수와 일치하는 경우에만 던져하려면, (지금 athrow 때마다 일을 오전으로) 모든 잡힌 예외를 throw하지 않습니다.

시도했지만 Falling off the end of the code 클래스 확인 오류가 발생했습니다.

ASM을 사용할 수 있습니까?

미리 감사드립니다.

답변

1

이 작업을 수행 할 수 있습니다. Java 및 ASMifier에서 원하는 내용을 작성하여 바이트 코드가 어떻게 구성되는지 확인할 수 있습니다.

IDE를위한 ASM 플러그인이 있습니다.

+0

예, ASMifier는 훌륭합니다. – omainegra

0

코드 조각은 실제로하는 일에 대한 정보가 너무 적습니다. 특정 조건에서만 예외를 던지기를 원하지만 다른 일을하고 싶지는 않다고 말합니다. 검증 자 오류와 완벽하게 일치합니다. 특정 조건에서 throw 명령어를 건너 뛰고 메소드의 다른 끝을 제공하지 않으면 코드가 메소드의 끝에서 벗어납니다. 해당 사례에 대한 코드를 제공해야합니다 (예 : 통제 된 수익. 대안은 귀하의 기준을 충족시키지 못하는 예외를 잡는 것이 아니라 모든 예외를 다시 던지는 것과 동일한 행동을 끝낼 수있는 것입니다.