你知道吗并记录所有抛出的异常(无论是否被捕获和处理)?
这是我的问题:有一个应用程序,我无法更改,有时它会出现创建锁文件的问题(下面的相关代码)。当它调用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;
}
我希望:能够看到例外的细节。
其他信息:
基本上,它之前有效,并且“突然”和“无原因”停止。所以现在我正在调查。
我正在开始对应用程序进行远程调试,但在此之前,欢迎提出建议: - )
谢谢, 乔
更新
为了记录,问题的根本原因是rpc.statd守护程序死了。 因此,本机锁定机制通过NFS失败。 症状是IOException,并显示消息:“没有锁可用”。
对Hans Maes的称赞
答案 0 :(得分:2)
您可以创建自己的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);
}
}
}
编译成一个类文件,然后将-Xbootclasspath:/ directoryWhereClassFileIsLocated /添加到tomcat选项中。