3

我有一个主要课程,我有类似的东西

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
  }
}

解析字符串是

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

4 回答 4

9

但由于某种原因,错误不会向上传播......

它没有向上传播的原因是你抓住了它。异常在被捕获时停止传播。

要么不抓住它parseString,要么在处理程序中重新抛出它;例如e.printStackTrace(); throw e;


但是,这可能会让您遇到更多问题,特别是因为您在此处捕获/抛出异常。问题是这Exception是所有检查异常的根源:

  • 由于它是一个已检查的异常,因此该方法必须parseString声明它是否要传播该异常。throwsException

  • 但是throws Exception说这个方法可能会抛出任何可能的检查异常......这让调用者的生活变得困难。(不是在这个例子中......但一般来说。)

我的建议如下:

  • 避免创建/投掷Exception. 选择一个更具体(已检查或未检查)的异常,以反映您尝试报告的“异常事件”的含义......或实现您自己的异常类。在这种情况下,抛出IllegalArgumentException可能会更好,尽管这是一个未经检查的异常。

  • 避免需要传播的情况Exception

  • 抓的时候要小心Exception。它捕获每个(非Error)异常,包括所有未检查的异常;即RuntimeExecption及其子类。

于 2013-09-19T22:32:50.520 回答
3

你要么不抓住它ParseString,要么用throw e;

一旦捕获到异常,它就不会传播,除非你throw再次传播。

于 2013-09-19T22:31:40.420 回答
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");
  }
}

周围的函数应该知道如何明确地处理该异常,而不是仅仅因为它是一般异常而将其举起手来。

于 2013-09-19T22:34:07.633 回答
2

你不应该用 try/catch 来包围你的错误:

void ParseString(String s){
  if (matcher.matches()) {

        }
        else{
            //throw exception
            throw new Exception("bad formatted N-triples");}
        }
}

当您抛出错误时,它会在parseString方法内的 catch 语句中被捕获,这就是 not 不会传播到顶部的原因。

理想情况下,你会这样做:

void ParseString(String s) throws Exception  {
  if (matcher.matches()) {

        }
        else{
            //throw exception
            throw new Exception("bad formatted N-triples");}
        }
}
于 2013-09-19T22:33:05.183 回答