متداخلة محاولة اللحاق مع Reponse.Redirect في ASP.NET
سؤال
ولقد تداخل الكتل الصيد محاولة
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 في داخل الكتلة الأولى الصيد، ثم أيضا لمحاولة ... الصيد يحيط Response.Redirect
، تم اكتشاف ThreadAbortException الناتجة عن التحويل عن طريق كتلة التقاط الخارجي.
وكيف يمكنني حل هذه المشكلة؟ شكرا!
المحلول
وماذا يمكنك أن تفعل أكثر ببساطة لا إعادة توجيه داخل بك حاول / يسخر الصيد:
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);}
استخدم متغير لتعقب عندما تم طرح خطأ في محاولة الداخلي ... الصيد ومن ثم التحقق من ذلك في الشوط الثاني عن طريق المحيطة Response.Redirect مع بيان إذا.
وكلما كنت تستخدم Response.Redirect داخل كتلة حاول اللحاق، يجب عليك إضافة المعلمة الثانية.
وبدلا من هذا:
Response.Redirect("somepage.aspx");
هل هذا:
Response.Redirect("somepage.aspx", false);
عند هذا منطقي صحيح، يتم إرسال محتويات صفحة إلى صفحة جديدة (بحيث يمكنك استخدام القيم النموذج). عندما يكون منطقية غير صحيح، لا يتم إرسال محتويات الصفحة. وربما هذا هو ما تريد. وكنت أعرف إذا كنت في حاجة حقيقية.
وثمة نهج آخر لهذا هو للقبض على ThreadAbortException فيها في كتلة اقبض فارغة.