【问题标题】:Java - Can I use an empty catch statement?Java - 我可以使用空的 catch 语句吗?
【发布时间】:2015-09-08 17:25:24
【问题描述】:

我正在开发一个基本的 Java 命令行电子邮件客户端应用程序。我提供的连接器将向我发送电子邮件,但是如果我“发送”一封电子邮件,它不会位于连接器上,因为我自己创建了这封电子邮件。现在,当我想删除一封电子邮件时,我可以找到我所在的文件夹并按其 ID 将其删除。如果它位于连接器内,我还想从连接器中删除它,以便在刷新电子邮件时我不会再次收到此电子邮件。

public boolean delete(int messageId) throws IndexOutOfBoundsException
{
if (folders.get(getActiveFolderName()).delete(messageId))
{
    if (connector.retrMessage(messageId) != null)
    {
    connector.markMessageForDeleting(messageId); 
    //throws exception if not found on connector
    }
    return true;
}
return false;
}

我试过了,这是处理异常的一种非常糟糕的方法吗?:

public boolean delete(int messageId)
{
if (folders.get(getActiveFolderName()).delete(messageId))
{
    try{
    connector.markMessageForDeleting(messageId);
    } catch (IndexOutOfBoundsException e)
    {
  //this successfully soaks up the exception if its not located in connector
    }
    return true;
}
return false;
}

谢谢

【问题讨论】:

  • 检查列表/数组中是否有该元素而不是使用异常来控制流程不是更好吗?
  • 除了您已经收到的好答案之外,我不得不说connector 必须写得很糟糕才能将IndexOutOfBoundsException 作为ONLY表示它没有该消息的方式。

标签: java exception try-catch


【解决方案1】:

虽然它们被认为是坏的,但只要您了解正在发生的事情并采取必要措施从程序的异常行为中恢复,就可以了。

我只是建议你至少写一个日志声明。

【讨论】:

    【解决方案2】:

    我个人不这么认为。您将异常用作特定结果的指示符。您不是在捕获代码时不做任何事情来隐藏代码中的某些错误。但是,我不确定您是否有能力更改此连接器的任何内容,但如果可以,您应该对其进行调整,以免一开始就引发类似的错误。

    【讨论】:

      【解决方案3】:

      您正在做的事情称为异常吞咽。这通常被认为是不好的做法。风险是吞下您的电子邮件位于连接器中时可能发生的异常。你不想这样。

      您已经知道出现 IndexOutOfBoundsException 的原因,那么为什么不先测试您的电子邮件是否位于连接器中?

      【讨论】:

        【解决方案4】:

        记录任何异常总是好的做法,然后在像您这样的情况下可以忽略。

        P.S.:在您的情况下,无需使用堆栈跟踪来淹没日志。它可以是一条简单的错误消息,表明可以安全地忽略异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-07
          • 1970-01-01
          • 2023-03-05
          • 2016-06-19
          相关资源
          最近更新 更多