在java中向上传播错误

时间:2013-09-19 22:30:31

标签: java

我有一个主要类,我有类似

的东西
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方法中,即使函数的格式化数据不正确,错误计数器也不会递增。

如何向上传播此异常?

4 个答案:

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