我是靠谱客的博主 阔达水蜜桃,最近开发中收集的这篇文章主要介绍java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我试图通过异常捕获运行时异常.我能够捕获通常的方法退出事件.

但是,控件永远不会到达opcode == Opcodes.ATHROW.

我认为在调用事件时做错了事.

这是我的示例代码:

public void visitCode() {

// mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");

// mv.visitLdcInsn("Entering method " + fQMethodName);

// mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream","println","(Ljava/lang/String;)V");

}

@Override

public void visitInsn(int opcode)

{

if (opcode == Opcodes.ATHROW)

{

mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");

mv.visitLdcInsn("Exiting on exception " );

mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",

"(Ljava/lang/String;)V");

}

super.visitInsn(opcode);

}

public void visitMethodInsn(int opcode, String owner, String name,

String desc) {

super.visitMethodInsn(opcode, owner, name, desc);

//

if (opcode == Opcodes.ATHROW)

{

mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");

mv.visitLdcInsn("Exiting on exception " + name);

mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",

"(Ljava/lang/String;)V");

}

else if (!name.equals("println")

&& !name.equals("")

&& (opcode == Opcodes.INVOKEVIRTUAL || opcode == Opcodes.INVOKESPECIAL

|| opcode == Opcodes.INVOKESTATIC || opcode == Opcodes.INVOKEDYNAMIC)) {

this.currentMethod = name;

onFinally(opcode);

}

}

private void onFinally(int opcode) {

mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err",

"Ljava/io/PrintStream;");

mv.visitLdcInsn("Returning to " + fQMethodName + " from " + currentMethod);

mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",

"(Ljava/lang/String;)V");

}

在运行时异常时,将清除现有堆栈内容,仅保留可抛出对象.我可以通过ASM获得堆栈顶部元素(基本上是堆栈框架)吗?

非常感谢.

编辑:

这是我添加try-catch块后的修改程序.

@Holger:谢谢您的帮助.真的很感激.

因此,我试图在ASM的MethodVisitor中插入动态try-catch块.

这是我的代码:

public void visitCode()

{

super.visitCode();

this.visitTryCatchBlock(lblTryBlockStart, lblTryBlockEnd, lblCatchExceptionBlockStart, "java/lang/Exception");

this.visitLabel(lblTryBlockStart);

}

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);

// load the exception

this.visitVarInsn(Opcodes.ALOAD, 1);

// call printStackTrace()

//this.visitInsn(Opcodes.ATHROW);

this.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V");

// exit from this dynamic block

this.visitLabel(exitBlock);

super.visitMaxs(maxStack+2, maxLocals+2);

}

我的意图是添加动态try-catch块,如果抛出任何异常,则将其打印出来.

最后

以上就是阔达水蜜桃为你收集整理的java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常的全部内容,希望文章能够帮你解决java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部