【问题标题】:Can I throw exception again when I catch it?当我捕捉到它时,我可以再次抛出异常吗?
【发布时间】:2015-02-18 12:26:50
【问题描述】:
try{
      WebElement naimi_logo = firefox.findElement(By.xpath("//a[@href=\"/astana/\"]/img") ) ;

      naimi_logo.click();


  }catch( IllegalStateException e){
      throw new IllegalStateException("this image is not clickable!") ;
  }
  catch(NoSuchElementException e){
      throw new NoSuchElementException("logo is not found!!") ;
  }

我真的应该在我的 catch 块中抛出异常吗?还是只打印控制台发生的事情更好?

捕获的顺序重要吗?

【问题讨论】:

  • 这取决于您的要求,但可以肯定的是,这是可能的。但是 catch 块并不是真的只是重新抛出一个异常,而是处理它,或者抛出你自己定制的异常类型。
  • 如果来自第一个异常的信息没有足够的信息来处理它,那么是的,您应该重新抛出必要的信息。由于它不是英语或西班牙语,我不知道这是不是其中一种情况。
  • 你想用这个 catch 块实现什么?
  • @ERJAN 我的意思是什么阻止你使用原始异常(不捕获)?
  • ERJAN:catch 块在这里没有任何改变。实际上,您正在使情况变得更糟:您添加了一条描述问题所在的错误消息,而没有首先验证这是否是问题所在。

标签: java exception-handling try-catch


【解决方案1】:

看起来您的意图是在发生异常时添加更多信息。在这种情况下,您正在做的事情很好。但是,您将丢失底层异常的完整堆栈跟踪。

你可以使用:

java.lang.RuntimeException.RuntimeException(String, Throwable)

如果您不想丢失原始异常的堆栈跟踪。

【讨论】:

  • 确保避免:记录异常并抛出新异常是不好的做法。总是把它包起来或照顾它永远不要合并。
【解决方案2】:

捕捉到异常可以再次抛出吗?

只是重新抛出你所做的异常

throw e;

另一方面,这相当于根本不捕获异常并让它传播。

也许你想给异常一个更好的消息,但保留异常类。然后你通常会这样做:

}catch( IllegalStateException e){
    throw new IllegalStateException("this image is not clickable!", e);
}
catch(NoSuchElementException e){
    throw new NoSuchElementException("logo is not found!!", e);
}

我真的应该在我的 catch 块中抛出异常吗?

这取决于 您的 方法打算做什么。你的选择基本上是

  • 优雅地捕捉和处理异常。即使出现“内部”异常,您的方法也可以正常完成。
  • 捕获异常并将其包装在另一个更适合您的抽象级别的异常中。
  • 让异常传播。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 2022-06-15
    • 1970-01-01
    • 2010-09-13
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多