我想在我的程序中进行一般化的异常处理。它应该显示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()...
写入的行。是有办法检索我需要的信息吗?
答案 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();
}
它将打印行号异常,下一个索引指向链中的外部方法。