Вложенная попытка-перехват с ответом.Перенаправление в ASP.NET
Вопрос
У меня есть вложенные блоки try catch
try
{
// statements
try
{
// statements
}
catch(SqlException sqlex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message)
+ "&src=" + Server.UrlEncode(sqlex.ToString()));
}
catch (Exception ex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
+ "&src=" + Server.UrlEncode(ex.ToString()));
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
+ "&src=" + Server.UrlEncode(ex.StackTrace));
}
finally
{
conn.Close();
}
Если SqlExeception перехватывается во внутреннем первом блоке catch, то также потому, что try ...catch окружает Response.Redirect
, исключение ThreadAbortException, сгенерированное при передаче, перехватывается внешним блоком catch.
Как я могу решить эту проблему?Спасибо!
Решение
Прочитайте эту статью
Самое простое, что вы можете сделать, - это не перенаправлять внутри цепочек try / catch:
string url ;
try
{
// statements
try
{
}
catch(SqlException sqlex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message) + "&src=" + Server.UrlEncode(sqlex.ToString());
}
catch (Exception ex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.ToString());
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.StackTrace);
}
finally
{
conn.Close();
}
}
if ( url != "" ) {
Response.Redirect(url);
}
else {
// Page logic can continue
}
Другие советы
Рассмотрите возможность изменения кода в первом ответе
if ( url != "" ) { Response.Redirect(url);}
Для
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
Используйте переменную, чтобы отслеживать, когда во внутреннем try ... catch выдается ошибка, а затем проверять ее во второй, окружив Response.Redirect оператором if.
Каждый раз, когда вы используете Response.Redirect внутри блока try-catch, вы должны добавить второй параметр.
Вместо этого:
Response.Redirect("somepage.aspx");
Сделайте это:
Response.Redirect("somepage.aspx", false);
Когда это логическое значение true, содержимое страницы отправляется на новую страницу (так что вы можете использовать значения формы). Если это логическое значение false, содержимое страницы не отправляется. Это, вероятно, то, что вы хотите. Вы бы знали, если вам нужно правда.
Другой подход к этому - перехватить исключение ThreadAbortException в пустом блоке Catch.