如何识别具有特定数据的throwable

时间:2016-11-06 03:07:49

标签: java

我抓住了抓住任何未捕获的异常

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

的nullpointer异常

我该怎么做?我不确定扔掉哪些参数我应该比较?

抛出异常的代码不是我写的,所以我无法改变它。

重要提示 我知道我接近这个问题的方式不是正确的方法。但我无法访问提高异常的库,我需要一个解决方法,直到在库中修复了错误。选择答案是因为它满足了我的需要,而不是通常应该是什么

3 个答案:

答案 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.
       }
   }
});

你应该这样做的原因:

  1. 真的很难看
  2. hashString方法的任何更改都会使此无效
  3. 因为妈妈这么说
  4. Statistics课程的任何更改都会使此无用
  5. 如果是2或4,找到由此异常引起的错误可能会非常痛苦
  6. 它不可移植(考虑将来更换库)
  7. 这是不好的做法

答案 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 githubMaven link