Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 如何避免重复try块_Java - Fatal编程技术网

Java 如何避免重复try块

Java 如何避免重复try块,java,Java,我正在使用aws用Java编写一个Web服务,在许多方法中,我需要一个try-catch块,它可以实际记录每个公开方法执行过程中可能出现的任何错误 @WebMethod(operationName = "listingBucket") public String listingBucket() { String message = ""; try { message = "Listing buckets";

我正在使用aws用Java编写一个Web服务,在许多方法中,我需要一个try-catch块,它可以实际记录每个公开方法执行过程中可能出现的任何错误

@WebMethod(operationName = "listingBucket")
public String listingBucket() {
    String message = "";        
    try {
        message = "Listing buckets";            
        for (Bucket bucket : s3.listBuckets()) {
            message += " - " + bucket.getName();
        }
    } catch (AmazonServiceException ase) {
        message += "Caught an AmazonServiceException, which means your request made it "
                + "to Amazon S3, but was rejected with an error response for some reason.";
        message += "Error Message:    " + ase.getMessage();
        message += "HTTP Status Code: " + ase.getStatusCode();
        message += "AWS Error Code:   " + ase.getErrorCode();
        message += "Error Type:       " + ase.getErrorType();
        message += "Request ID:       " + ase.getRequestId();
    } catch (AmazonClientException ace) {
        message += "Caught an AmazonClientException, which means the client encountered "
                + "a serious internal problem while trying to communicate with S3, "
                + "such as not being able to access the network.";
        message += "Error Message: " + ace.getMessage();
    }
    return message;
}
@WebMethod(operationName = "addObjectToBucket")
public String addObjectToBucket(String bucketName, String objectName, File file) throws IOException{
    if ( file == null ){
        file = createSampleFile();
    }
    String message = "";        
    try {
        message += "Uploading a new object to S3 from a file\n";     
        s3.putObject(new PutObjectRequest(bucketName, objectName, file));
    } catch (AmazonServiceException ase) {
        message += "Caught an AmazonServiceException, which means your request made it "
                + "to Amazon S3, but was rejected with an error response for some reason.";
        message += "Error Message:    " + ase.getMessage();
        message += "HTTP Status Code: " + ase.getStatusCode();
        message += "AWS Error Code:   " + ase.getErrorCode();
        message += "Error Type:       " + ase.getErrorType();
        message += "Request ID:       " + ase.getRequestId();
    } catch (AmazonClientException ace) {
        message += "Caught an AmazonClientException, which means the client encountered "
                + "a serious internal problem while trying to communicate with S3, "
                + "such as not being able to access the network.";
        message += "Error Message: " + ace.getMessage();
    }
    return message;        
}
我怎样才能避免重复这个try-catch-block-throw所有使用这种东西的方法呢

谢谢你的帮助

编辑:实际上我修改了代码:

private String parseError(AmazonServiceException ase) {
    String message;
    message = "Caught an AmazonServiceException, which means your request made it "
            + "to Amazon S3, but was rejected with an error response for some reason.";
    message += "Error Message:    " + ase.getMessage();
    message += "HTTP Status Code: " + ase.getStatusCode();
    message += "AWS Error Code:   " + ase.getErrorCode();
    message += "Error Type:       " + ase.getErrorType();
    message += "Request ID:       " + ase.getRequestId();
    return message;
}

private String parseError(AmazonClientException ace) {
    String message;
    message += "Caught an AmazonClientException, which means the client encountered "
            + "a serious internal problem while trying to communicate with S3, "
            + "such as not being able to access the network.";
    message += "Error Message: " + ace.getMessage();
    return message;
}

@WebMethod(operationName = "listingBucket")
public String listingBucket() {
    String message = "";
    try {
        message = "Listing buckets";
        for (Bucket bucket : s3.listBuckets()) {
            message += " - " + bucket.getName();
        }
    } catch (AmazonServiceException exc) {
        message += parseError(exc);
    } catch (AmazonClientException exc) {
        message += parseError(exc);
    }
    return message;
}
确实更清楚!:


我将只看一下命令模式,看看是否可以将其用于此类应用程序。

这里有两个方面

一件事是关于catch块中的代码重复;可以很容易地转化为

public class ExceptionHandler {

public String buildMessageFor(AmazonServiceException ase) {
... }

public String buildMessageFor(AmazonClientException ase) {
... }
...
您甚至可以非常轻松地对其进行单元测试,从而改进命名;但是我想这个例子应该足够好,可以让你继续下去

这也将使将来更容易从纯字符串消息转换为其他消息。要知道,在源代码中硬编码用户消息并不是最明智的做法

另一部分,try/catch本身;这要看情况而定。你看,尝试/捕获是你操作的重要部分;很多人会说,您只是在代码中保留了这种结构。唯一的选择是定义某种接口,如

public interface RunAmazonOperation {
public void run() throws Amazon...
}
然后,您可以将所有操作写为实现该接口的小类;被某个为您执行try/catch的框架调用。如果这是值得的价格。。。取决于您的应用程序


换句话说:如果你转向命令模式;您可能会发现定义各种命令很有用;实现该接口;从而大大减少了使用try/catch的地点数量。

这里有两个方面

一件事是关于catch块中的代码重复;可以很容易地转化为

public class ExceptionHandler {

public String buildMessageFor(AmazonServiceException ase) {
... }

public String buildMessageFor(AmazonClientException ase) {
... }
...
您甚至可以非常轻松地对其进行单元测试,从而改进命名;但是我想这个例子应该足够好,可以让你继续下去

这也将使将来更容易从纯字符串消息转换为其他消息。要知道,在源代码中硬编码用户消息并不是最明智的做法

另一部分,try/catch本身;这要看情况而定。你看,尝试/捕获是你操作的重要部分;很多人会说,您只是在代码中保留了这种结构。唯一的选择是定义某种接口,如

public interface RunAmazonOperation {
public void run() throws Amazon...
}
然后,您可以将所有操作写为实现该接口的小类;被某个为您执行try/catch的框架调用。如果这是值得的价格。。。取决于您的应用程序


换句话说:如果你转向命令模式;您可能会发现定义各种命令很有用;实现该接口;这样就大大减少了使用try/catch的位置数。

只需使用方法即可。一种可能是:

String parseError(AmazonServiceException ase){
    String message;
    message = "Caught an AmazonServiceException, which means your request made it "
            + "to Amazon S3, but was rejected with an error response for some reason.";
    message += "Error Message:    " + ase.getMessage();
    message += "HTTP Status Code: " + ase.getStatusCode();
    message += "AWS Error Code:   " + ase.getErrorCode();
    message += "Error Type:       " + ase.getErrorType();
    message += "Request ID:       " + ase.getRequestId();
    return message;
}

String parseError(AmazonClientException ace){
    String message;
    message = "Caught an AmazonClientException, which means the client encountered "
            + "a serious internal problem while trying to communicate with S3, "
            + "such as not being able to access the network.";
    message += "Error Message: " + ace.getMessage();
    return message;
}
现在你可以写:

catch(AmazonServiceException exc){
    message=parseError(exc);
}
catch(AmazonClientException exc){
    message=parseError(exc);
}

只要用方法就行了。一种可能是:

String parseError(AmazonServiceException ase){
    String message;
    message = "Caught an AmazonServiceException, which means your request made it "
            + "to Amazon S3, but was rejected with an error response for some reason.";
    message += "Error Message:    " + ase.getMessage();
    message += "HTTP Status Code: " + ase.getStatusCode();
    message += "AWS Error Code:   " + ase.getErrorCode();
    message += "Error Type:       " + ase.getErrorType();
    message += "Request ID:       " + ase.getRequestId();
    return message;
}

String parseError(AmazonClientException ace){
    String message;
    message = "Caught an AmazonClientException, which means the client encountered "
            + "a serious internal problem while trying to communicate with S3, "
            + "such as not being able to access the network.";
    message += "Error Message: " + ace.getMessage();
    return message;
}
现在你可以写:

catch(AmazonServiceException exc){
    message=parseError(exc);
}
catch(AmazonClientException exc){
    message=parseError(exc);
}

您需要Java8Lambdas来干净地完成这项工作。这是一个选项吗?注意:message=替换先前的值。您只需执行一次,多次执行会丢弃以前的值。事实上,是的,我正在使用Java 8,我正在研究Lambda,如果您有解决方案,我很想看看它!:您需要Java8Lambdas来干净地完成这项工作。这是一个选项吗?注意:message=替换先前的值。您只需执行一次,多次执行会丢弃以前的值。事实上,是的,我正在使用Java 8,我正在研究Lambda,如果您有解决方案,我很想看看它!:这是重复catch部分主体的一个改进。是的,我知道纯字符串消息并不聪明,但实际上它只是用于测试目的。对我来说,这只是能够构造一个使用AmazonSDK的简单Web服务。稍后我将改进这一部分,因为它是后端Web服务。将有一个AngularJS Web应用程序来使用该Web服务。这是重复捕获部分主体的一个改进。是的,我知道纯字符串消息并不聪明,但实际上它只是用于测试目的。对我来说,这只是能够构造一个使用AmazonSDK的简单Web服务。稍后我将改进这一部分,因为它是后端Web服务。将有一个AngularJS网络应用程序来使用该Web服务。是的,我在=x之前忘记了+我的错!嗯,这种情况经常发生。你会第一次看到它:-。是的,我在=x之前忘记了+我的错!嗯,这种情况经常发生。你会第一次看到它:-。