Общий способ добавить информацию в Throwable без создания нового Throwable - PullRequest
2 голосов
/ 19 ноября 2008

Было бы полезно добавить общий способ добавления информации в Throwable без создания нового Throwable?

Я часто вижу такой код:

try {
  foo();
} catch(Exception e) {
  throw new Exception(e.getMessage() + " extra info=" + blah, e);
}

Было бы лучше вместо этого добавить Throwable.setProperty (ключ String, значение String), чтобы приведенный выше код стал следующим?

try {
  foo();
} catch(Exception e) {
  e.setProperty("extra info", blah);
  throw e;
}

Дополнительная информация может выводиться (по одному в строке) между сообщением и списком стеков.

Преимущества: 1. Не требует создания новых Throwables только для добавления дополнительной информации. 2. У следов стека не должно быть нескольких слоев следов причин (и, следовательно, будет легче читать) 3. Уменьшите стоимость создания дополнительных следов стека.

Ответы [ 3 ]

3 голосов
/ 19 ноября 2008

Связанные исключения уже заботятся об удалении избыточных кадров стека. То есть данный кадр стека будет отображаться только один раз. Это вопрос мнения, но я бы посчитал недостатком связанное исключение недостатком.

Было бы неплохо продлить расширение RuntimeException. Это может помочь в этом отношении.

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

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

1 голос
/ 20 ноября 2008

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

0 голосов
/ 19 ноября 2008

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

try {
  foo();
} catch (Exception e) {
  throw new MySpecificException("extra info=" + blah, e);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...