Поймать исключение, добавить данные и реконструировать его - программирование
Подтвердить что ты не робот

Поймать исключение, добавить данные и реконструировать его

У меня есть следующий код:

try
{
   OnInitialize();
}
catch (PageObjectLifecycleException exception)
{
   exception.OldLifecycleState = CurrentLifecycleState;
   exception.RequestedLifecycleState = LifecycleState.Initialized;
   throw exception;
}

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

throw;

Но мне интересно: будет ли это правильно воссоздать исключение измененное или немодифицированное оригинальное?

Изменить. В ответ на комментарии "Попробуйте и посмотрите": я новичок в С#, начиная с С++. В С++ вы часто находите поведение undefined в подобных случаях в углу, и меня интересует, действительно ли то, что я хочу, как это официально работает.

4b9b3361

Ответ 1

Он будет ссылаться на измененное исключение.

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

Ответ 2

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

try {
    // code
}
catch(Exception e) {
    throw e;
}

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

try {
    // code
}
catch(Exception e) {
    throw;
}

Приведенный выше код при компиляции в IL вызовет вызов rethrow. Это отличается от throw, поскольку rethrow используется, чтобы сигнализировать, что блок, в котором обрабатывается исключение, по какой-то причине решил не обрабатывать его, и поэтому ответственность должна быть предложена блоку catch более высокого порядка (следующий вверх).

Метод rethrow сохраняет текущую трассировку стека вызовов, чтобы можно было отслеживать происхождение исключения. Однако метод throw запускает новую трассировку стека вызовов. Я думаю, что это имеет смысл, как только вы поймете, для чего предназначены два метода.

По моему опыту вы используете throw exception;, когда хотите по какой-либо причине исключить исключение (например, проверка объекта не удалась), и вы использовали бы throw; в выводе после того, как вы выполнили некоторую регистрацию (т.е. пока у вас все еще есть доступ к полезной информации в объекте, который не прошел проверку, прежде чем передавать ответственность за обработку исключений на более высокий уровень).

В вашем примере я бы предположил, что если вам нужно добавить дополнительную информацию в исключение, у вас есть случай для создания совершенно нового исключения и его повышения. Таким образом, вы должны использовать метод throw exception;, где "исключение" представляет собой новое исключение, содержащее дополнительную информацию и исходное исключение.

Надеюсь, что это поможет!

Джеймс

Ответ 3

Вы можете добавить дополнительную информацию в данные и перебросить исключение с помощью throw, чтобы сохранить свою оригинальную форму и callstack

try
{
   ...
}
catch (PageObjectLifecycleException exception)
{
   exception.Data.Add("additional data", "the additional data");
   throw;
}

Ответ 4

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