在java中向上传播错误

Moh*_*hit 3 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,错误不会向上传播.在我的FooBar方法中,即使函数格式化数据不正确,错误计数器也不会递增.

如何向上传播此异常?

Ste*_*n C 9

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

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

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


但是,这可能会让你遇到更多问题,特别是因为你在这里捕获/投掷的例外情况.问题是Exception所有已检查异常的根源:

  • 既然是检查异常,则该方法parseString必须声明它throwsException,如果你想将异常传播.

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

我的建议如下:

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

  • 避免需要传播的情况Exception.

  • 当你抓到时要小心Exception.它捕获每个(非Error)异常,包括所有未经检查的异常; ie RuntimeExecption及其子类.