Я знаю, что ответ уже выбран, но здесь немного больше информации по этому вопросу.
try {
// code
}
catch(Exception e) {
throw e;
}
Приведенный выше код при компиляции в IL будет вызывать throw
, передавая ссылку на обработанное исключение в качестве аргумента. Как вы, вероятно, знаете, вы можете вызвать throw
из любого места в вашем коде, чтобы вызвать исключение.
try {
// code
}
catch(Exception e) {
throw;
}
Приведенный выше код при компиляции в IL вызовет rethrow
. Это отличается от throw
, поскольку rethrow
используется, чтобы сигнализировать о том, что блок, в котором было обработано исключение, по какой-то причине решил не обрабатывать его, и поэтому следует предложить ответственность блоку захвата более высокого порядка (следующий ).
Метод rethrow
сохраняет текущую трассировку стека вызовов, чтобы можно было отследить источник исключения. Однако метод throw
запускает новую трассировку стека вызовов. Я думаю, что это имеет смысл, как только вы поймете, для чего предназначены два метода.
По моему опыту, вы используете throw exception;
, когда хотите по какой-то причине вызвать исключение (например, проверка объекта не удалась), и вы бы использовали throw;
в операторе catch после выполнения некоторой регистрации (то есть, пока у вас все еще есть доступ к полезной информации в объекте, который не прошел проверку, прежде чем передать обязанности по обработке исключений на более высокий уровень.
В вашем примере я хотел бы предложить, что если вам нужно добавить больше информации к исключению, у вас есть возможность создать совершенно новое исключение и вызвать его. Таким образом, вы бы использовали метод throw exception;
, где «исключение» - это новое исключение, содержащее дополнительную информацию и первоначально выданное исключение.
Надеюсь, это поможет!
Джеймс