深度超过 2 层的嵌套方法中的异常处理
Exception handling in nested methods with more than 2 levels deep
假设我们有嵌套的方法 A、B 和 C,如下所示:
public void A(){
try{
B();
}
catch(Exception e){
log.error(e);
}
}
public void B(){
C();
}
public void C(){
try{
some_stuff();
}
catch(Exception e){
log.error(e)
}
}
因为我在C()捕获了异常,只用logging来处理,而B()没有任何catch,我是否在A()捕获异常?
或者我应该在 C() 处抛出异常并在 B() 处添加一个 try catch 以便能够在 A() 中处理它?
当你做的时候
public void C(){
try{
some_stuff();
}
catch(Exception e){
log.error(e)
}
}
此时将处理异常。您将记录它并忽略异常。如果要记录并向上传播,则需要从 catch
子句中重新抛出。
由于检查了异常(据我所知),您需要更改方法签名以指示您从 C
.
中抛出此异常
在B
时不需要处理,只需更改方法签名即可表明该方法抛出Exception。
阅读更多关于 Java 检查异常与未检查异常的信息 enter link description here
最后,如果您想传播到 A
,代码将如下所示:
public void A(){
try{
B();
}
catch(Exception e){
log.error(e);
}
}
public void B() throws Exception{
C();
}
public void C() throws Exception{
try{
some_stuff();
}
catch(Exception e){
log.error(e)
throw e;
}
}
您正在处理 catch
块中的异常,因此它不会进一步传播给调用者。这与您是记录它还是用它做任何其他事情无关。如果你想将它传播给调用者,你需要重新抛出它:
[...]
catch (Exception e) {
// do something
throw e;
}
如何处理异常取决于代码的设计。
假设我们有嵌套的方法 A、B 和 C,如下所示:
public void A(){
try{
B();
}
catch(Exception e){
log.error(e);
}
}
public void B(){
C();
}
public void C(){
try{
some_stuff();
}
catch(Exception e){
log.error(e)
}
}
因为我在C()捕获了异常,只用logging来处理,而B()没有任何catch,我是否在A()捕获异常?
或者我应该在 C() 处抛出异常并在 B() 处添加一个 try catch 以便能够在 A() 中处理它?
当你做的时候
public void C(){
try{
some_stuff();
}
catch(Exception e){
log.error(e)
}
}
此时将处理异常。您将记录它并忽略异常。如果要记录并向上传播,则需要从 catch
子句中重新抛出。
由于检查了异常(据我所知),您需要更改方法签名以指示您从 C
.
在B
时不需要处理,只需更改方法签名即可表明该方法抛出Exception。
阅读更多关于 Java 检查异常与未检查异常的信息 enter link description here
最后,如果您想传播到 A
,代码将如下所示:
public void A(){
try{
B();
}
catch(Exception e){
log.error(e);
}
}
public void B() throws Exception{
C();
}
public void C() throws Exception{
try{
some_stuff();
}
catch(Exception e){
log.error(e)
throw e;
}
}
您正在处理 catch
块中的异常,因此它不会进一步传播给调用者。这与您是记录它还是用它做任何其他事情无关。如果你想将它传播给调用者,你需要重新抛出它:
[...]
catch (Exception e) {
// do something
throw e;
}
如何处理异常取决于代码的设计。