0

私は時々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と一致する場合にのみスローします。exceptionMethodVisitor

そうしようとしましたが、Falling off the end of the codeクラス検証エラーが発生しました。

ASM を使用して行うことは可能ですか?

前もって感謝します。

4

2 に答える 2

2

これを行うことができます.Javaで必要なものを記述し、ASMifierでバイトコードを記述して、それがどのように構造化されているかを確認することをお勧めします.

これを簡単にする IDE 用の ASM プラグインがあります。

于 2013-10-03T17:18:34.930 に答える
0

あなたのコードフラグメントは、あなたが実際に何をしているかについてほとんど情報を提供しません。特定の条件下でのみ例外を(再)スローしたいと言いますが、それ以外の場合は何をしたいのかは言いません。これは検証エラーと完全に一致します。特定の条件下で throw 命令をスキップし、メソッドの代替終了を提供しなかった場合、コードはメソッドの終了から外れます。その場合のコードを提供する必要があります (制御された返品など)。別の方法は、基準を満たさない例外をキャッチすることではありませんが、すべての例外を再スローするのと同じ動作になります。

于 2013-11-07T11:50:38.190 に答える