Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在catch块中抛出异常是否无用?_Java_Exception - Fatal编程技术网

Java 在catch块中抛出异常是否无用?

Java 在catch块中抛出异常是否无用?,java,exception,Java,Exception,我试图找出在java中处理异常的最佳方法。 在catch块中抛出RunTimeException是个好主意还是没用 public final void clickOnElement(MobileElement mobileElement, int secondsToWait) { try { abstractPlatform.clickOnElement(mobileElement,secondsToWait); } catch (Exception e) {

我试图找出在java中处理异常的最佳方法。 在catch块中抛出RunTimeException是个好主意还是没用

public final void clickOnElement(MobileElement mobileElement, int secondsToWait) {
    try {
        abstractPlatform.clickOnElement(mobileElement,secondsToWait);
    } catch (Exception e) {
        throw new NoSuchElementException("Wasn't able to click on element " + mobileElement);
    }
}

有时确实需要运行时异常而不是检查异常

} catch (Exception e) {
    throw new NoSuchElementException("Wasn't able to click on element " + mobileElement, e);
}
我将指定确切的异常,如
IOException | SQLException
,并将其作为原因添加到rethrow中

最近的一个用例是lambda,它位于不允许检查异常的上下文(流)中

或者简单地添加可能有助于查明错误的其他信息,如文件名或SQL语句和参数


特别是IllegalArgumentException和IllegalStateException可以比其他异常提供更多的信息。

不,这不是没有用的,我在编写代码时经常这样做。我宁愿看到自己的自定义异常,并显示一条关于错误的消息,因为在大多数情况下,您都在处理捕获到的异常,您将知道它抛出的原因,因此,我更希望看到一个异常,其中包含关于具体问题的详细消息,而不是抛出一个通用异常,而只是在控制台中看到一条错误消息,这是一个无用的示例

try {
    abstractPlatform.clickOnElement(mobileElement,secondsToWait);
} catch (Exception e) {
    throw e;
}
public final void clickOnElement(MobileElement mobileElement, int secondsToWait) 
{
  try 
  {
    abstractPlatform.clickOnElement(mobileElement,secondsToWait);
  } 
  catch (Exception e) 
  {
    logError(this, "clickOnElement()", "Wasn't able to click on element"+mobileElement);
    throw new NoSuchElementException("Wasn't able to click on element " + mobileElement);
  }
}

它可能没用,也可能没用,完全取决于我们如何使用它。我使用它的方式是为了维护异常日志

public final void clickOnElement(MobileElement mobileElement, int secondsToWait) 
{
  try 
  {
    abstractPlatform.clickOnElement(mobileElement,secondsToWait);
  } 
  catch (Exception e) 
  {
    logError(this, "clickOnElement()", "Wasn't able to click on element"+mobileElement);
    throw new NoSuchElementException("Wasn't able to click on element " + mobileElement);
  }
}
现在,在本例中,我创建了一个方法,该方法记录了该特定方法的异常,通过查看日志,我可能能够找出异常的原因。但是让我们假设这段代码正在API中使用

作为API设计器,我希望返回一些特定的状态代码,而不是显示tomcat/framework发送的异常消息。在这种情况下,我们可以在catch中抛出异常,该异常可以保存在某个父方法中,或者由框架本身保存(如果有某种机制的话)


所以这取决于我们如何使用它

定义无用。捕获一个异常的可能副本,只是为了通过抛出另一个异常使应用程序停止。在我看来,这是非常无用的。是的。从技术角度来看,对于给定的代码片段,如果执行catch,它将抛出异常。尝试捕获处理异常。因此,根据您的要求,它应该由您自己决定。如果您需要抛出一个定制的异常而不是真正的异常,该怎么办。因此,由您决定是否值得。这完全取决于您在异常触发时想做什么。在您的示例中,您捕获了所有异常,并假设它们都是“NoSuchElementException”。我不认为lambdas是最近的一个用例,它们是在Java 8中引入的,并且这一个已经快到生命的尽头了,或者您可能需要做一些清理,然后重试。@Ferrybig在Java的大方案中,是的,lambdas是一个相当新的发展。特别是如果你认为很多仍然运行java 7.但我想补充一点,如果ClickOneElement没有抛出任何已检查的异常,那么它应该捕获RuntimeException而不是异常。@FedericoklezCulloca是的,清理和重试也提醒我使用资源进行尝试。我同意你的看法,这一切都取决于你的实现,若要实现弹性搜索或日志记录模块,则必须在catch块中抛出异常