如何仅从异常中获取必要信息?

时间:2016-12-07 12:02:34

标签: java exception exception-handling

我想在我的程序中进行一般化的异常处理。它应该显示JOptionPane.showMessageDialog(null, "There was an unexpected Exception: ");谎言。现在我还想在对话框中添加必要的信息。我知道如何获取异常的类型(e.getClass();),但有没有办法只获取类似哪个类/方法和哪一行的信息?

例外示例: at com.mainfirst.bloomberg.invoice.report.Etst.main(Etst.java:35)

我想只将部分放在括号内。我尝试Thread.currentThread().getStackTrace()[2].getLineNumber()我在similar question中找到的内容,但是这返回了null,所以我尝试了其他索引,索引1返回Thread.currentThread()...写入的行。是有办法检索我需要的信息吗?

2 个答案:

答案 0 :(得分:0)

Pattern p = Pattern.compile("/\([\w\W]*\)/");
Matcher m = p.matcher(e.printStackTrace());

JOptionPane.showMessageDialog(null, "There was an unexpected Exception: "+m.group(1))

编辑:

使用e.getStackTrace()代替e.printStackTrace(),因此您可以将异常消息作为字符串获取。

使用m.group(0)代替m.group(1)以匹配整个正则表达式。在这种情况下,它会产生相同的效果,但如果你在正则表达式中有更多的组,你就可以选择匹配的组。

这个特定的正则表达式只匹配第一次出现,因为它的末尾没有/ g修饰符。

答案 1 :(得分:0)

  

但是这返回了null,所以我尝试了其他索引和索引1   返回Thread.currentThread()...写入

的行

这是因为你正在使用 Thread.currentThread()。getStackTrace()而不是 e.getStackTrace()。得到如此的行号:

try{
   method();
}
catch(Exception e){
   e.getStackTrace()[0].getLineNumber();
   e.getStackTrace()[0].getFileName();
   e.getStackTrace()[0].getMethodName();
}

它将打印行号异常,下一个索引指向链中的外部方法。