2016-03-03 6 views
1

Я кодирую веб-сервис в Java с помощью aws, и во многих методах мне нужно иметь блок catch try, который может фактически регистрировать любые ошибки, которые могут возникнуть при выполнении каждого открытого метода.Как избежать повторения блока try

@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;   
} 

Как я могу избежать повторения этой попытки catch block бросить все методы, которые используют этот материал?

Благодарим за помощь!

Edit: На самом деле я изменил код:

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; 
} 

Clearer в самом деле! :)

Я просто взгляну на шаблон команды, чтобы узнать, могу ли я использовать его для такого приложения.

+0

Вам нужно Java 8 лямбды, чтобы сделать это чисто. Это вариант? –

+0

Примечание: 'message =' * заменяет * предыдущее значение. Вам нужно только сделать это один раз, и выполнение этого более одного раза отбрасывает предыдущее значение. –

+0

На самом деле да, я использую Java 8, и я ищу Лямбду, если у вас есть решение с тем, что мне любопытно взглянуть на него! :) – Slater

ответ

3

Здесь есть два аспекта.

Одна вещь о повторении кода в блоке 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.

+0

Это улучшает повторение * body * разделов catch. –

+0

Да, я знаю, что чистое строковое сообщение не умное, но на самом деле это только для целей тестирования. Это просто для меня возможность создать простой веб-сервис, который использует The Amazon SDK. Я улучшу эту часть позже, потому что это веб-сервис back end.Для использования этого Webservice будет использовать AngularJS Webapp. – Slater

+0

Я обязательно посмотрю на шаблон команды! :) – Slater

1

Просто сделайте это с помощью методов. Одним из возможных вариантов будет выглядеть так:

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); 
} 
+0

И да, я забыл + перед «=» x)) мой плохой на этом! – Slater

+1

Ну, это случается. В первый раз в уловке вы бы увидели это :-). – ctst

Смежные вопросы