Вопрос: Может ли простой оператор throw
в С# когда-либо вызывать новое исключение?
Обратите внимание, что я задаю этот вопрос из любопытства, а не потому, что у меня есть практическая или реальная ситуация, когда это имеет большое значение. Также обратите внимание, что мои чувства и опыт подсказывают мне, что ответ "Нет", но я хочу как-то проверить этот ответ (см. Далее источники, которые я пробовал до сих пор).
Вот пример кода для иллюстрации моего вопроса:
try
{
int x = 0, y = 1 / x;
}
catch (Exception outerException)
{
try
{
throw;
}
catch (Exception innerException)
{
// Q: Does this Assert ever fail??
System.Diagnostics.Debug.Assert(outerException.Equals(innerException));
}
}
Мне интересно, есть ли вообще способ изменить обстоятельства, при которых Assert
завершится с ошибкой, не касаясь внутреннего блока try/catch
.
Что я пробовал или пытался ответить на это:
- Прочитайте бросок (ссылка на С#) на MSDN - нет окончательного ответа;
- Проверенная часть 5.3.3.11 Спецификация языка С# - это, вероятно, неправильное место для поиска такого рода информации;
- Глянцевать через исключения, которые я мог бы попытаться вызвать в команде throw. Исключение OutOfMemoryException приходит на ум, но его трудно вызвать во время
throw
. - Открыл ILDASM, чтобы проверить сгенерированный код. Я вижу, что
throw
преобразуется в инструкциюrethrow
, но я теряюсь там, где нужно посмотреть, чтобы проверить, может ли этот оператор или не может выполнить исключение.
Это то, что ILDASM показывает для внутреннего бита try
:
.try
{
IL_000d: nop
IL_000e: rethrow
} // end .try
Итак, чтобы суммировать: может ли оператор throw (используемый для перебора исключения) когда-либо вызывать само исключение?