我有一个主要课程,我有类似的东西
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方法中,即使函数格式化数据不正确,错误计数器也不会递增.
如何向上传播此异常?
但由于某种原因,错误不会向上传播......
它没有向上传播的原因是你抓住了它.捕获时异常会停止传播.
要么不抓住它parseString,要么在处理程序中重新抛出它; 例如e.printStackTrace(); throw e;
但是,这可能会让你遇到更多问题,特别是因为你在这里捕获/投掷的例外情况.问题是Exception所有已检查异常的根源:
既然是检查异常,则该方法parseString必须声明它throws的Exception,如果你想将异常传播.
但是throws Exception说这种方法可能抛出任何可能的检查异常......这使得调用者的生活变得困难.(不是在这个例子中......但总的来说.)
我的建议如下:
避免创建/投掷Exception.选择一个更具体(已检查或未检查)的异常,该异常反映您尝试报告的"异常事件"的含义...或实现您自己的异常类.在这种情况下,抛出IllegalArgumentException可能会更好,尽管这是一个未经检查的例外.
避免需要传播的情况Exception.
当你抓到时要小心Exception.它捕获每个(非Error)异常,包括所有未经检查的异常; ie RuntimeExecption及其子类.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |