如何提取 try catch 外部方法?

How to extract try catch outside method?

我有这个方法 sendParameterValueAsMQTTMessage(),我用它通过 MQTT 发布关于特定主题的消息。我正在使用 try catch 两次(未嵌套),但它看起来仍然有些丑陋并且方法过于拥挤。我读了一篇关于干净代码的文章,其中鲍勃叔叔谈到提取 try catch 的主体,但我似乎没有很好地理解它,或者至少在我的情况下没有。

如何通过将其提取到外部来摆脱方法中的 try catch

public void sendParameterValueAsMQTTMessage() {
    String payload = null;
    try {
        payload = convertToJSONString("range", String.valueOf(range));
    } catch (JSONException e) {
        this.logger.log(Level.ERROR, e);
    }

    MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC,payload,0);

    try {
        this.client.publish(message);
        Thread.sleep(3000);
    } catch (Exception e) {
        this.logger.log(Level.ERROR, e);
    }
}

您可以对方法内的两种可能异常使用单个通用 catch,如下所示:

public void sendParameterValueAsMQTTMessage() {
    String payload = null;
    try {
        payload = convertToJSONString("range", String.valueOf(range));

        MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC,payload,0);

        this.client.publish(message);
        Thread.sleep(3000);
    } catch (Exception e) {
        this.logger.log(Level.ERROR, e);
    }
}
public void sendParameterValueAsMQTTMessage() {
    String payload = null;
    try {
        payload = convertToJSONString("range", String.valueOf(range));
    } catch (JSONException e) {
        this.logger.log(Level.ERROR, e);
    }

    MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC,payload,0);
  publishMessage(message); //extracted in a new method
}

public void publishMessage(MQTTMessage message){
    try {
        this.client.publish(message);
        Thread.sleep(3000);
    } catch (Exception e) {
        this.logger.log(Level.ERROR, e);
    }
}

你可以把你所有的代码放在一个 try 块中,并设置多个 catch,当异常发生时,与之关联的 catch 将被执行,例如:

try{    
                int a[]=new int[5];    
                a[5]=30/0;    
               }    
               catch(ArithmeticException e)  
                  {  
                   System.out.println("Arithmetic Exception occurs");  
                  }    
               catch(ArrayIndexOutOfBoundsException e)  
                  {  
                   System.out.println("ArrayIndexOutOfBounds Exception occurs");  
                  }    

提供的代码存在多个不同的问题,以下是我重构它的方式:

public void sendParameterValueAsMQTTMessage() {
    final String payload = tryGetPayloadAsJson();
    if (payload != null) {
        trySendPayloadViaMQTT(payload);
    }
}

private String tryGetPayloadAsJson() {
    try {
        return convertToJSONString("range", String.valueOf(range));
    } catch (JSONException e) {
        this.logger.log(Level.ERROR, e);
    }

    return null;
}

private void trySendPayloadViaMQTT(final String payload) {
    try {
        final MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC, payload, 0);
        this.client.publish(message);
        Thread.sleep(3000);
    } catch (Exception e) {
        this.logger.log(Level.ERROR, e);
    }
}

根据 Bob 叔叔的建议,这里可能需要改进的一件事是实际将 try/catch 移到 trySendPayloadViaMQTT 之外,如下所示:

public void sendParameterValueAsMQTTMessage() {
    final String payload = tryGetPayloadAsJson();
    if (payload != null) {
        trySendPayloadViaMQTT(payload);
    }
}

private String tryGetPayloadAsJson() {
    try {
        return convertToJSONString("range", String.valueOf(range));
    } catch (JSONException e) {
        this.logger.log(Level.ERROR, e);
    }

    return null;
}

private void trySendPayloadViaMQTT(final String payload) {
    try {
        sendPayloadViaMQTT(payload);
    } catch (Exception e) {
        this.logger.log(Level.ERROR, e);
    }
}

private void sendPayloadViaMQTT(final String payload) {
    final MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC, payload, 0);
    this.client.publish(message);
    Thread.sleep(3000);
}