Response.Redirect - использовать исключения для управления потоком? - PullRequest
2 голосов
/ 23 февраля 2009

Response.Redirect имеет две перегрузки:

public void Redirect(string url)

Parameters:
url: The target location.
public void Redirect(string url, bool endResponse)
Parameters:
url: The location of the target.
endResponse: Indicates whether execution of the current page should terminate.

Если я вызываю первую перегрузку или вызываю вторую с endResponse, установленным на true, то ThreadAbortException выдается.

Почему я хотел бы использовать этот подход? Разве это не пример использования исключений для обработки потока программы? (и, следовательно, плохо)

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

Ответы [ 4 ]

2 голосов
/ 24 февраля 2009

Zhaph прав, это исключение происходит, потому что вы перенаправляете в блоке try catch.

Вместо

try {
    ...
    Response.Redirect(url);
} catch {
    ...
}

Сделайте что-нибудь в этом духе:

bool bSuccess = true;
try {
    ...
} catch {
    bSuccess = false;
    ...
}

if (bSuccess) {
    Response.Redirect(url);
}
2 голосов
/ 23 февраля 2009

Если для endResponse установлено значение «true», вы фактически говорите: «Я закончил с этой страницей, игнорируйте все, что за мной».

Причина возникновения исключения "ThreadAbortException" заключается в том, что все записанные в конец значения / захваты и т. Д. Запускаются, а ресурсы корректно очищаются перед отправкой на следующую страницу.

С MSDN :

ThreadAbortException - это особое исключение, которое может быть перехвачено, но оно будет автоматически возбуждено снова в конце блока catch. Когда возникает это исключение, среда выполнения выполняет все блоки finally перед окончанием потока.

1 голос
/ 23 февраля 2009

Иногда исключения являются лучшим способом управления потоком вашей программы.

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

Исключение в Response.Rirectirect для прерывания текущего потока - это хорошо, потому что это именно то, что вы хотите.

1 голос
/ 23 февраля 2009

Я думаю, что теория заключается в том, чтобы не тратить впустую лошадиные силы. Если во время цикла запроса вы решите, что 5 вызовов функций находятся в глубине, что перенаправление уместно, вам понадобится какой-то способ сообщить всем функциям более высокого уровня: «Мы закончили, не тратьте больше времени на этот запрос» и сам asp.net также должен был бы сделать это.

Я думаю, что команда asp.net выбрала этот подход, а не a) Использование возвращаемого значения функции (это означает, что если функция имеет логическое возвращаемое значение, это должно быть решено с помощью параметров Ref / Out), или б) Установка флажка по запросу. Конечно, сама ASP.Net была бы написана в честь флага, но сколько начинающих разработчиков будет полагаться на то, что они должны проверять его (после каждого вызова функции?), И поэтому они все еще могут выполнять некоторую тяжелую работу, которая будет впустую.

...