我抓住了抓住任何未捕获的异常
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
}
});
在方法内部,我想以不同于其他例外的方式处理以下异常:
Caused by: java.lang.NullPointerException
at com.company.si.stats.Statistics.hashString(Statistics.java:192)
at com.company.si.stats.Statistics.sendStatistics(Statistics.java:127)
我基本上要检查它是来自com.company.si.stats.Statistics.hashString
我该怎么做?我不确定扔掉哪些参数我应该比较?
抛出异常的代码不是我写的,所以我无法改变它。
重要提示 我知道我接近这个问题的方式不是正确的方法。但我无法访问提高异常的库,我需要一个解决方法,直到在库中修复了错误。选择答案是因为它满足了我的需要,而不是通常应该是什么
答案 0 :(得分:4)
评论中提到了这一点,我认为将其添加为答案是个好主意,但请记住这不是你应该怎么做的,所以请以这个答案为例说明如何不处理此类问题。随意也可以投票。
您可以looking at its stack trace或至少在第一个堆栈跟踪元素处检查异常的来源。
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
StackTraceElement[] stackTrace = e.getStackTrace();
if (e instanceof NullPointerException &&
stackTrace != null && stackTrace.length >= 0 &&
"Statistics.java".equals(stackTrace[0].getFileName()) &&
"hashString".equals(stackTrace[0].getMethodName()) &&
192 == stackTrace[0].getLineNumber()) {
// Handle your exception here.
}
}
});
你应该不这样做的原因:
hashString
方法的任何更改都会使此无效Statistics
课程的任何更改都会使此无用答案 1 :(得分:0)
您可以创建自己的例外,例如:
public class HashingException extends RuntimeException {
public HashingException(Throwable t) {
super(t);
}
}
正如您所说,com.company.si.stats.Statistics.hashString()
方法并非由您制作,因此您无法对其进行更改。但是you can translate the exception thrown by it。我不确定方法签名是什么样的,但是你可以这样做:
// ... some code, Statistics object initialization somewhere
String hashString;
try {
hashString = statistics.hashString(someArgumentMaybe);
} catch (Exception e) {
throw new HashingException(e);
}
// result of method is available here as hashString object
然后在您的handler
类中处理它,如:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
if (e instanceof HashingException) {
HashingException hashingException = (HashingException) e;
// Handle your exception here.
Exception cause = e.getCause();
// cause will be NullPointerException
}
}
});
答案 2 :(得分:0)
有一种简单的方法可以将堆栈跟踪作为字符串或读取器
ByteArrayOutputStream stacktraceContent = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(stacktraceContent));
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(new
ByteArrayInputStream(stacktraceContent.toByteArray())))) {
// Here you can read your stacktrace line by line and match against any
// pattern
}
还有一个很好的开源库可以过滤日志。它叫做MgntUtils库。在这里,您可以找到详细描述它的文章:
Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison。本文还提供了github(source)和Maven的链接,您可以在其中下载或将其集成到Maven项目中。以下是链接:MgntUtils on github和Maven link