2013-10-03 2 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 каждый раз сейчас), вместо этого я хочу бросить, только если он совпадает с exception параметром метода подписи MethodVisitor.

Я попытался это сделать, но получил Falling off the end of the code Класс проверки ошибки.

Можно ли использовать ASM?

Заранее спасибо.

ответ

1

Вы можете сделать это, я предлагаю вам написать то, что вы хотите в Java и ASMifier, в байтовый код, чтобы увидеть, как он структурирован.

Существует плагин ASM для IDE, который делает это проще.

+0

Да, ASMifier отлично – omainegra

0

Ваш фрагмент кода дает слишком мало информации о том, что вы на самом деле делаете. Вы говорите, что хотите (пере) исключить исключение только при определенном условии, но вы не говорите, что хотите сделать иначе. Это отлично соответствует ошибке верификатора: если вы пропустите команду throw в определенных условиях и не предоставили альтернативный конец метода, ваш код упадет с конца метода. Вы должны предоставить код для этого случая, например. контролируемое возвращение. Альтернативой является не перехватывание исключений, которые не соответствуют вашим критериям, но это может привести к тому же поведению, что и повторное бросание всех исключений.

 Смежные вопросы

  • Нет связанных вопросов^_^