Какое правильное сообщение об ошибке для снабжения Google Guava есть. * Методы?

StackOverflow https://stackoverflow.com/questions/3128120

Вопрос

Например, при использовании Предварительным условиями, Предполагается ли сообщение об ошибке, чтобы отразить проходящий случай или неспособность к вопросу о проверке?

import static com.google.common.base.Preconditions.*;

void doStuff(int a, int b) {
  checkArgument(a == b, "a == b");
  // OR
  checkArgument(a == b, "a != b");
}
Это было полезно?

Решение

Для проверки предварительного условия, указав требование В подробности исключения сообщения более информативно, чем просто указывает на факты. Это также приводит к гораздо более естественно, чтение кода:

То документация Предоставляет следующий пример:

Это позволяет конструировать, такие как

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }

быть замененным более компактным

 checkArgument(count > 0, "must be positive: %s", count);

Две вещи отмечают:

  • Пример четко заявляет, что требование, а не факт
    • "что-то должно быть правильно", вместо "что-то является неправильно"
  • Инвертируя состояние проверки, вся конструкция читать более естественно

Следующим этим примером лучшее сообщение будет:

checkArgument(a == b, "a must be equal to b"); // natural!

Вы даже можете пойти на шаг дальше и захватить значения a а также b В сообщении исключения (см. Эффективное java 2nd Edition, пункт 63: включить информацию о захвате отказов подробностей):

checkArgument(a == b, "a must be equal to b; instead %s != %s", a, b);

Альтернатива заявленных фактов менее естественно читается в коде:

checkArgument(a == b, "a != b");              // awkward!
checkArgument(a == b, "a is not equal to b"); // awkward!

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

Другим недостатком поставленных фактов является то, что для сложных предварительных условий, это потенциально менее информативно, потому что пользователь может уже знать о том, но не то, что фактические требования - это нарушено.

Связанные вопросы

Другие советы

Документация дает примеры, которые делают это очень понятно, используя слова вместо символов:

checkArgument(count > 0, "must be positive: %s", count);

Учитывая, что они в основном просто будут просто сообщениями сообщений в журналах (или сеансах отладки), делают все, что вы думаете, сделает его ясным для всех, кто смотрит на проблему, или кто-либо читает код, чтобы понять предварительное условие.

Например, вы мог Переписать вышеуказанное как:

checkArgument(count > 0, "count must be positive; was actually %s", count);

Лично, для чего-то вроде этого я думаю, я бы написал

checkArgument(a == b, "a (%s) must equal b (%s)", a, b);

Часто (большую часть времени) вы можете просто использовать метод CheckarGument () без Параметр сообщения об ошибках, то есть вообще не поставляя сообщение об ошибке.

Чтобы сделать хорошее сообщение об ошибке, необходимо понять, кто прочитал сообщение. Это не конечный пользователь; Если предварительное условие не удается, то указывает, скорее всего, к ошибке в коде. Текст может объяснить неудачное предварительное условие, но в большинстве случаев он не используется для конечного пользователя, он должен быть подсказкой для программиста. Большую часть времени сообщение само по себе также не имеет смысла без укладки и исходного кода. Фактически, в большинстве случаев укладка и исходный код именно то, что программист должен исправить ошибку, сообщение об ошибке не помогает. Если предварительное условие не очевидно, комментарий рядом с ним является идеальным способом документировать его.

Необходимость всегда поставлять сообщение об ошибке в случаях, никто действительно не заботится о тексте, приводит к программистам, делающим бесполезным, очевидным и не полезным сообщениям, которые делают только код менее читаемым.

Есть некоторые случаи, когда сообщение об ошибке может быть полезным, например, сообщение может содержать фактические значения переменных, но из нашего опыта, который не очень часто, и в этих случаях вы можете использовать сообщение.

Аналогичные аргументы применяются также в утверждении методах в Junit; Всегда предоставляя сообщение об ошибке не очень хорошая идея.

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

Так как Полигенераторы указал:

Для проверки предварительного условия, заявив требование в подробном сообщении исключения, более информативна, чем просто указывает на факты.

Хотя вы, безусловно, можете сделать это с Guava Handondions, Требования API. (который я был автором) позволяет вам добиться лучшего вывода без каких-либо усилий с вашей стороны.

Гуавские предпосылки

String a = "foosball";
String b = "ballroom";
Preconditions.checkArgument(a == b, "a == b");

дает вам это:

java.lang.IllegalArgumentException: a == b
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
    at Main.main(Main.java:142)

Требования API.

String a = "foosball";
String b = "ballroom";
requireThat(a, "a").isEqualTo(b, "b")

дает вам это:

output

Тот же вход, лучший выход.

(Если ваш терминал не поддерживает цвета, вы получите текстовый разфтал)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top