- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
出于日志记录的目的,我创建了一个方法 logTitle(),它打印出 TestNG 测试的调用方法名称。示例代码如下。
@Test
public void test1() throws Exception {
method1();
}
public static void method1() throws Exception {
Utils.logTitle(2);
}
...
public static void logTitle(Integer level) throws Exception {
// Gets calling method name
String method = Thread.currentThread().getStackTrace()[2].getMethodName();
// This would get current method name
switch (level) {
case 1:
logger.info("=======================================================");
logger.info(method);
logger.info("=======================================================");
break;
case 2:
logger.info("------------------------------------");
logger.info(method);
logger.info("------------------------------------");
break;
case 3:
logger.info("---------------------");
logger.info(method);
logger.info("---------------------");
break;
case 4:
logger.info("--------- " + method + " ------------");
break;
default:
logger.info(method);
}
}
问题是我在两台不同的机器上得到不同的 logTitle() 结果。
每个人的笔记本电脑都正确返回:
2016-06-20 14:22:06 INFO - ------------------------------------
2016-06-20 14:22:06 INFO - method1
2016-06-20 14:22:06 INFO - ------------------------------------
我们的开发 unix 框返回不同:
2016-06-20 14:42:26 INFO - ------------------------------------
2016-06-20 14:42:26 INFO - logTitle
2016-06-20 14:42:26 INFO - ------------------------------------
这在其他所有人的笔记本电脑上都能正常工作,但在开发 unix 机器上却不行。我认为 dev unix 机器使用的是 IBM 的 Java 版本,而其他人都在使用 Oracle 的 Java 版本,但不确定这是否是罪魁祸首。
有什么想法吗?
最佳答案
来自 Javadoc :
Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this throwable is permitted to return a zero-length array from this method.
因此,唯一有保证的方法是使用方面,或使用其他一些自定义方式收集堆栈跟踪。但是您可以将此方法与回退结合起来,以某种方式获取当前方法的名称(以防您的 logTitle
方法将被内联)。可以找到here , 例如。同样,不能保证,但有更好的机会。
关于java - 为 getStackTrace()[2].getMethodName() 获得不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932635/
有点不正统的情况 - 基本上我有线程 A 监视线程 B。如果线程 A 检测到线程 B 负责的周期性任务之一(线程 B 不是 ThreadPoolExecutor 的一部分,它是MINA 的线程之一)已
在一个日志系统中,每条日志的输出都是由一个辅助类用这样的方法完成的 public void debug(String message) { Logger logger = Logger.get
使用 Delphi 7,如何从 Exception 中获取表示堆栈跟踪的字符串? try SomethingDodgy(); except on E:Exception do begin
我无法理解这段代码。我很了解语法,但为什么使用 getStackTrace() 和 setStackTrace() ?我的意思是我想知道它在现实世界场景中的实现是什么?即,这段代码的期望输出是什么?
出于日志记录的目的,我创建了一个方法 logTitle(),它打印出 TestNG 测试的调用方法名称。示例代码如下。 @Test public void test1() throws Excepti
本文整理了Java中org.jboss.wsf.spi.WSFException.getStackTrace()方法的一些代码示例,展示了WSFException.getStackTrace()的具体
我目前正在尝试为包验证方法编写 JUnit4 测试。 该方法只是检查调用是否来自正确的包,以确保它不是从外部调用的。方法和RegEx本身可以工作,但是为了安全起见,我想添加一个单元测试。 简单来说,这
这是对 What happens when there's insufficient memory to throw an OutOfMemoryError? 的后续问题 我的问题如下:如果预先分配了
我正在使用 new Throwable().getStackTrace()[1].getMethodName() 一些开发人员认为它价格昂贵。这种方法的成本在哪里?我们应该使用它吗?如果是,那么应该注
我正在使用较旧的 Java 版本进行开发,该版本没有 getStackTrace() 方法。有一个 printStackTrace 方法,但它没有打印在我想要的地方。 有没有办法提取Exception
我是一名优秀的程序员,十分优秀!