Вложенный try-catch с Reponse.Redirect в ASP.NET - PullRequest
1 голос
/ 30 ноября 2009

Я вложил попробуйте поймать блоки

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 перехватывается во внутреннем первом блоке перехвата, то также из-за того, что try ... catch окружает Response.Redirect, исключение ThreadAbortException, генерируемое передачей, перехватывается внешним блоком перехвата.

Как я могу решить эту проблему? Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

Читать эта статья

Самое простое, что вы можете сделать, - это не перенаправлять в жгутах пробовать / ловить:

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
}
1 голос
/ 01 декабря 2009

Рассмотрите возможность изменения кода в первом ответе

if ( url != "" ) { Response.Redirect(url);}

до

if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
0 голосов
/ 30 ноября 2009

Каждый раз, когда вы используете Response.Redirect внутри блока try-catch, вы должны добавить второй параметр.

Вместо этого:

Response.Redirect("somepage.aspx");

Сделайте это:

Response.Redirect("somepage.aspx", false);

Если это логическое значение true, содержимое страницы отправляется на новую страницу (так что вы можете использовать значения формы). Если это логическое значение false, содержимое страницы не отправляется. Это, вероятно, то, что вы хотите. Вы бы знали, если вам нужно правда.

Другой подход к этому - перехватить исключение ThreadAbortException в пустом блоке Catch.

0 голосов
/ 30 ноября 2009

Используйте переменную, чтобы отслеживать, когда во внутреннем try ... catch выдается ошибка, а затем проверять ее во второй, окружив Response.Redirect оператором if.

...