2016-12-11 2 views
0

Я создаю приложение в Play Framework и сталкиваюсь с проблемой в одном из моих определений функций. На самом деле это не вопрос в Play Framework, но это относится к Play, потому что из-за этой ошибки sbt compile не работает.Обработка исключений с возвращаемыми значениями

Так что я эта функция в одном из моих классов:

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     e.printStackTrace(); 
    } 
    return response.getBody().getObject(); 
} 

Поэтому я решил поймать исключение внутри функции, что я не хочу, чтобы моя функцию throw исключения. Потому что тогда этот try-catch должен выполняться в нескольких местах, где выполняется вызов этой функции. Я могу избежать этого, поставив throws UnirestExecption, но это будет пузыриться полностью через весь стек функций, вплоть до конструкторов классов.

Однако с текущим кодом, мой IDE и sbt compile и скажи:

[error]: variable response might not have been initialized 

Как выйти из этого в этом случае? Я не могу сделать new HttpResponse(), потому что class definition выглядит слишком страшно для меня. Я, конечно, не могу сделать еще Unirest.get(), потому что это сделает исключение из своего собственного!

Что такое более быстрый выход?

+1

Что вы хотите, чтобы ваша функция возвращала, когда ' Вызывается UnirestException'? – Marvin

+0

@ Марвин Я даже не думал об этом! См. Мой комментарий к принятому ответу. :-) – dotslash

ответ

1

Что вы ожидаете от ответа, если возникло исключение? Если response = Unirest.get(url).asJson(); выдает исключение, ваш объект ответа будет неинициализирован.

Вы можете либо обернуть исключение поймали и повторно выдать это нравится:

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     throw new RuntimeException(e); 
    } 
    return response.getBody().getObject(); 
} 

или возвращает значение какой-то по умолчанию, если запрос GET не удается:

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     return null; 
    } 
    return response.getBody().getObject(); 
} 
+1

Также обратите внимание, что 'null', вероятно, не самый лучший способ использовать как« значение по умолчанию ». – Jezor

+1

Обратите внимание, что вы не хотите регистрировать трассировки стека с помощью System.out', потому что в будущем вам может понадобиться переключиться на другой регистратор, например, Slf4j, и не удивляться, если вы не столкнетесь со всеми трассировками стека. Запишите свои исключения с помощью регистраторов или не запишите их вообще. – Jezor

+1

Я не использую 'System.out' для регистрации ошибки. что заставляет тебя говорить это? Но в стороне, я ценю совет! :-) – dotslash

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