【发布时间】:2011-02-02 09:39:39
【问题描述】:
好吧,可能是个愚蠢的问题。 我正在做一个 java 项目,我希望能够轻松获取当前代码的位置,即 Package/Class/Method,并将其打印到输出。
例如,我想在错误的情况下输出Package/Class/Method信息,以便能够识别错误发生的确切方法。
有没有代码可以给我这个信息?
【问题讨论】:
标签: java error-handling
好吧,可能是个愚蠢的问题。 我正在做一个 java 项目,我希望能够轻松获取当前代码的位置,即 Package/Class/Method,并将其打印到输出。
例如,我想在错误的情况下输出Package/Class/Method信息,以便能够识别错误发生的确切方法。
有没有代码可以给我这个信息?
【问题讨论】:
标签: java error-handling
stacktrace 由JVM 提供,它包含所有这些信息,只需记录即可。
或者编程方式如果你想确定
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
根据Javadocs:
[...] 数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。
StackTraceElement 有getClassName()、getFileName()、getLineNumber() 和getMethodName()。
【讨论】:
stackTraceElements 包含所有信息
getStackTrace 或那里调用的东西。当然不能保证介于两者之间的任何事情。打印出整个堆栈会有所帮助,但您不能依赖它来学习当前的方法。
getStacktrace 并且需要 1 Thread.currentThread().getStackTrace()[1].getMethodName()
出现错误时创建异常。如果要将其打印到控制台,则可以在异常上调用exception.printstacktrace(); 方法。
最好使用 log4j 之类的日志框架,您可以使用logger.error( "message", exception );,您将在日志中获得堆栈跟踪。
【讨论】:
不要寻求如此复杂的解决方案。
如果您使用的是 log4j,那么您已经完成了。 使用这样的模式:%-5p %d [%t] %C{1}.%M(%L): %m%n
%t 是当前线程 %C{1} 是类的名称(省略 {1},您将获得带有包的完整限定名称) %M 是方法的名称 %L 是行号 详情请查看:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
请记住,登录方法的名称或行号会降低性能。 永远不要在生产系统中这样做。
【讨论】: