Вложенная попытка-перехват с ответом.Перенаправление в ASP.NET

StackOverflow https://stackoverflow.com/questions/1819962

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня есть вложенные блоки 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top