我收到错误:
“无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。”
当我将页面从一个页面重定向到另一个页面时。
我正在使用此代码:
try
{
Session["objtwitter"] = obj_UserDetSumit;
Response.Redirect("TwitterLogin.aspx");
}
catch (Exception ex)
{
lblStatus.Text = "Account Creation Failed, Please Try Again";
}
我得到了一个解决方案,我也尝试了这个Response.Redirect("home.aspx",false);
它不会抛出错误,但它也不会重定向页面。
答案 0 :(得分:4)
Try-catch在其中的代码周围创建一个线程以捕获异常。当您重定向时,您实际上终止了线程的执行,从而导致错误,因为执行无意识地结束(尽管这是设计)。你不应该在try-catch中重定向,如果你这样做,你应该使用Response.Redirect(“some url”,false);并且还特别捕获ThreadAbortException。
答案 1 :(得分:2)
参考此处:http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx
Response.Redirect调用Response.End,它会抛出ThreadAbortException,因此您需要将代码更改为:
try
{
Response.Redirect("home.aspx");
}
catch(System.Threading.ThreadAbortException)
{
// do nothing
}
catch(Exception ex)
{
// do whatever
}
答案 2 :(得分:0)
首先,确保您正在使用调试版本而不是项目的发布版本。其次,确保您在混合模式(托管和本机)中进行调试,以便您可以看到所有当前的调用堆栈。
答案 3 :(得分:0)
我会尝试将您的Response.Redirect移动到try catch块之外,如下所示:
try
{
Session["objtwitter"] = obj_UserDetSumit;
}
catch (Exception ex)
{
lblStatus.Text = "Account Creation Failed, Please Try Again";
return;
}
Response.Redirect("TwitterLogin.aspx");
大多数有此问题的人here通过调用Response.Redirect("TwitterLogin.aspx", false);
来解决它,而Response.Redirect(url);
没有立即明确地杀死该线程。我不确定为什么这对你不起作用。
我认为问题是你的Response.Redirect在try catch块中。致电Response.End();
来电ThreadAbortException
,这将招致Response.Redirect(url);
。
确保在进行重定向后不再尝试进行任何处理。
使用Reflector,您可以看到Response.Redirect(url, true);
来电Response.End();
传递true然后调用public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
....
}
,如下所示:
{{1}}
即使你的代码片段中没有finally,它也可能试图最终执行“空”,但不能因为线程被中止。只是一个想法。