我有一个主要类,我有类似
的东西void FooBar(String s){
try {
parseString(s);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error: " + e.getMessage());
context.getCounter(Counters.ERROR).increment(1); // this increment doesnt increases
}
}
parseString是
void ParseString(String s){
if (matcher.matches()) {
} else {
//throw exception
try {
throw new Exception("bad formatted N-triples");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
但由于某种原因,错误不会向上传播。在我的FooBar方法中,即使函数的格式化数据不正确,错误计数器也不会递增。
如何向上传播此异常?
答案 0 :(得分:9)
但由于某种原因,错误不会向上传播......
它没有向上传播的原因是你抓住了它。当被捕时,异常会停止传播。
要么不在parseString
中捕获它,要么在处理程序中重新抛出它;例如e.printStackTrace(); throw e;
然而,这可能会让你遇到更多问题,特别是因为你在这里捕捉/投掷的例外。问题是Exception
是所有已检查异常的根:
由于它是一个已检查的异常,因此如果您希望传播异常,方法parseString
必须声明throws
Exception
。
但throws Exception
表示此方法可能会抛出任何可能的已检查异常......这会使调用者的生活变得困难。 (不是在这个例子中......但总的来说。)
我的建议如下:
避免创建/投掷Exception
。选择一个更具体(已检查或未检查)的异常,该异常反映您尝试报告的“异常事件”的含义...或实现您自己的异常类。在这种情况下,抛出IllegalArgumentException
可能会更好,但这是一个未经检查的例外。
避免需要传播Exception
的情况。
抓住Exception
时要小心。它捕获每个(非Error
)异常,包括所有未经检查的异常;即RuntimeExecption
及其子类。
答案 1 :(得分:3)
你要么ParseString
没有抓住它,要么用throw e;
一旦发现异常,除非你再次throw
,否则它不会被传播。
答案 2 :(得分:3)
检查你在这里做了什么:
try {
throw new Exception("bad formatted N-triples");//You throw an exception!
} catch (Exception e) {//And immediately catch it!
e.printStackTrace();
}
因为捕获了异常,所以它不会传播。相反,删除try / catch块并简单地抛出异常:
void ParseString(String s){
if (matcher.matches()) {
//code for reasons
} else {
//throw exception
throw new Exception("bad formatted N-triples");
}
}
请注意,这实际上是不好的做法。您想对您的异常说些什么,并声明它:
void ParseString(String s) throws IllegalArgumentException {
if (matcher.matches()) {
//code for reasons
} else {
//throw exception
throw new IllegalArgumentException("bad formatted N-triples");
}
}
周围的函数应该知道如何明确地处理该异常,而不仅仅是抛弃它,因为它是一般的例外。
答案 3 :(得分:2)
您不应该使用try / catch包围错误:
void ParseString(String s){
if (matcher.matches()) {
}
else{
//throw exception
throw new Exception("bad formatted N-triples");}
}
}
当你抛出错误时,它会被parseString
方法中的catch语句捕获,这就是为什么不会传播到顶部。
理想情况下,你会这样做:
void ParseString(String s) throws Exception {
if (matcher.matches()) {
}
else{
//throw exception
throw new Exception("bad formatted N-triples");}
}
}