您知道在 Java 中记录所有曾经抛出的异常(无论是否捕获和处理)的方法吗?
这是我的问题:有一个应用程序,我无法更改,有时它在创建锁定文件时遇到问题(下面的相关代码)。当它调用 tryLock() 方法时,卡住 30 秒(尽管 tryLock 是非阻塞的),并返回失败 (CANT_CREATE_LOCK)。如您所见,所有捕获层都掩盖了真正的问题,甚至没有记录它。
final File lockFile = new File(fooHomeDir, ".foo-home.lock");
try
{
FileOutputStream stream = new FileOutputStream(lockFile);
try
{
if (stream.getChannel().tryLock() == null)
{
return LockResult.HELD_BY_OTHERS;
}
this.fileOutputStream = stream;
this.lockFile = lockFile;
return LockResult.OK;
}
catch (OverlappingFileLockException overlappingFileLockException)
{
return LockResult.HELD_BY_OTHERS;
}
catch (IOException ie)
{
return LockResult.CANT_CREATE_LOCK;
}
}
catch (FileNotFoundException fnfe)
{
return LockResult.CANT_CREATE_LOCK;
}
我的愿望:能够看到异常的详细信息。
其他信息:
- 环境为Linux、Java 1.7、Tomcat 7。
- fooHomeDir 指向一个支持 NFS 的挂载点。
- fooHomeDir 的权限没有改变。
- fooHomeDir 的所有者没有改变。
- fooHomeDir 的文件系统未满。
- 没有 SELinux 或其他可能干扰的东西。
基本上,它以前工作过,然后“突然”和“无故”停止了。所以现在我正在调查。
我正在开始对应用程序进行远程调试,但在此之前,欢迎提出建议:-)
谢谢, 乔
更新
郑重声明,问题的根本原因是 rpc.statd 守护进程死机了。 因此, native 锁定机制在 NFS 上失败。 症状是带有消息的 IOException:“没有可用的锁”。
感谢汉斯梅斯
最佳答案
您可以创建自己的 Exception 实现,它将记录创建的每个错误。然后使用 -Xbootclasspath:bootclasspath 将其添加到类路径中旗帜。我不会将其作为“最佳实践”推荐,但至少您可以找到问题的根源。
一个非常简单的例子(有改进的余地)
package java.lang;
public class Exception extends Throwable {
public Exception() {
super();
String exception = "Exception";
logWithStack(exception);
}
public Exception(String message) {
super(message);
logWithStack(message);
}
public Exception(String message, Throwable cause) {
super(message, cause);
logWithStack(message);
}
public Exception(Throwable cause) {
super(cause);
logWithStack(cause.getMessage());
}
protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
logWithStack(message);
}
private void logWithStack(String exception) {
System.out.println(exception);
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste);
}
}
编译成类文件,然后在tomcat选项中添加-Xbootclasspath:/directoryWhereClassFileIsLocated/。
关于java - 在 Tomcat 的 Web 应用程序中记录所有抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682952/