Java 如何避免重复try块
我正在使用aws用Java编写一个Web服务,在许多方法中,我需要一个try-catch块,它可以实际记录每个公开方法执行过程中可能出现的任何错误Java 如何避免重复try块,java,Java,我正在使用aws用Java编写一个Web服务,在许多方法中,我需要一个try-catch块,它可以实际记录每个公开方法执行过程中可能出现的任何错误 @WebMethod(operationName = "listingBucket") public String listingBucket() { String message = ""; try { message = "Listing buckets";
@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之前忘记了+我的错!嗯,这种情况经常发生。你会第一次看到它:-。