В предыдущей части было предложено три разных по своей сути решения.
Сегодня — новая загадка, из области ASP.NET. Её основное отличие от предыдущих в том, что я столкнулся с ней в реальной ситуации, и пришлось потратить время, чтобы разобраться, в чем же дело.
Также имеются четыре ссылки:
UPD Итак, правильные ответы:
Вопрос на «тройку»: куда приведет каждая из них? >>>Любая ссылка приведет на Error.aspx<<<
Вопрос на «четверку»: почему именно так? >>>
Вопрос на «пятерку»: как Вы предлагаете исправить ситуацию? >>>Больше всего мне понравился способ wdk: просто перехватить нужный тип исключения перед
Похоже, выбранный мной формат загадок не совсем подходит для блога .NET, поэтому ищите следующие загадки у меня в блоге :)
Спасибо всем!
Сегодня — новая загадка, из области ASP.NET. Её основное отличие от предыдущих в том, что я столкнулся с ней в реальной ситуации, и пришлось потратить время, чтобы разобраться, в чем же дело.
Итак, на странице Test.aspx имеется код:
protected void Page_Load(object sender, EventArgs e)<br>{<br> try<br> {<br> if (object.ReferenceEquals(Request["ID"], "aaa"))<br> {<br> Response.Redirect("~/PageA.aspx");<br> }<br> else if (Request["ID"] == "bbb")<br> {<br> Response.Redirect("~/PageB.aspx");<br> }<br> else<br> {<br> int i = int.Parse(Request["ID"]);<br> object boxedI = i;<br> if ((i > 5) && ((long)boxedI == 10))<br> {<br> Response.Redirect("~/Page10.aspx");<br> }<br> Response.Redirect("~/PageDafault.aspx");<br> }<br> } <br> catch (Exception)<br> {<br> Response.Redirect("~/Error.aspx");<br> }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Также имеются четыре ссылки:
- Test.aspx?ID=aaa
- Test.aspx?ID=bbb
- Test.aspx?ID=4
- Test.aspx?ID=10
UPD Итак, правильные ответы:
Вопрос на «тройку»: куда приведет каждая из них? >>>Любая ссылка приведет на Error.aspx<<<
Вопрос на «четверку»: почему именно так? >>>
Response.Redirect
прерывает поток выполнения кода страницы, бросая для этого ThreadAbortException
. catch(Exception)
ловит его, бросая опять в Response.Redirect
, но направляя при этом на другую страницу<<<Вопрос на «пятерку»: как Вы предлагаете исправить ситуацию? >>>Больше всего мне понравился способ wdk: просто перехватить нужный тип исключения перед
catch(Exception)
: habrahabr.ru/blogs/net/77154/#comment_2246114 Несмотря на всю простоту этого кода он делает именно то, что нужно: прерывает выполнение кода страницы. Поскольку исключение ThreadAbortException
регенерируется в конце блока catch
, это не приведет к выполнению ненужного кода за пределами блока try
и в других событиях страницы. А решение habrahabr.ru/blogs/net/77154/#comment_2245598 как раз приводит к такому выполнению, поэтому мне и не нравится<<<Похоже, выбранный мной формат загадок не совсем подходит для блога .NET, поэтому ищите следующие загадки у меня в блоге :)
Спасибо всем!