在我们的WEB程序是,我遇到用户登陆后,一段时间没操作,
然后不小心真了一堆数据,突然提示超时,然后转到其它页面(用session来处理是否登陆).
这样一来刚才填的数据库丢了.
另外,如果A页面出来错误,一般是以跟参数形式转到错误页,但这样好像也不大好.
不知大家有什么好的办法处理异常,不好的地方如:
1.错误信息在URL可以看到.
2.如果要转回刚才出错/或出错之前的页面,非得跟连接.
3.如果是根目录下好几级的子目录下,向上转要硬编写返回和转向路径.
等.
所以特别在此向有经验的朋友请教.
谢.

解决方案 »

  1.   

    刚接触.net不久,暂时在做web方面的开发.(asp.net 1.1 + c sharp ).
    但是遇到一个考虑了好久,始终没有得到最好办法的问题.
    特此请教!
    1.对于 web 中大家是如何做异常处理的.
      其中有影响决定的有:
    1.1 有的页面是在 IFrame有某个框架中出来的,那么如果按一般Response.Rdirect()到错误页面好像是不可行.
    1.2 如果Response.Redirect("")过去,那么错误信息如果也是直接Error.aspx?msg=Some error message.觉得也不行.
    1.3 如果错误发生后,可以怎么操作呢?返回(history.go(-1)还是如何?
    1.4 如果直接在try{}catch{}中catch(System.Exception)好像不符合设计,并且直接在引发处定义错误信息也不便   于将来对错误信息的纠正.2.如果遇到页面 Session("")的超时?如何检测呢?
    谢谢.
    这是我不解的,或者做得不够好的.
    希望有朋友能给我些帮助.
      

  2.   

    1.错误信息在URL可以看到
     写一个错误类数组,把出现的错误都放在一个数组里:错误时返回:Err.aspx?Errtype=1
     然后读去错误类型,再输入错误类型
    2.如果要转回刚才出错/或出错之前的页面,非得跟连接.
          history.go(-1) or window.location.go.back()3.如果是根目录下好几级的子目录下,向上转要硬编写返回和转向路径.
    等.
    所以特别在此向有经验的朋友请教.
    谢..如果遇到页面 Session("")的超时?如何检测呢?
     写个检测类
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                If Me.UserID = "" Then
                    HttpContext.Current.Response.Write("<script>alert('您没有登录或超时了!请重新登陆');window.location.href='../UserLogin.aspx';</script>")
                End If
            End Sub
      

  3.   

    超时的问题没什么好的办法...
    HTTP就这个样...无状态协议嘛返回错误页的处理很简单
    登陆处理完以后 转到request.RawUrl 就可以了
    或者你用FORM验证,自动跳转回前一个页面
      

  4.   

    1.错误信息在URL可以看到
     使用try{}catch{}得出错误号,传给错误页(还考虑用Server.Transfer()吗?).错误页调用自定义异常类.2.如果要转回刚才出错/或出错之前的页面,非得跟连接.
          history.go(-1) or window.location.go.back()3.如果是根目录下好几级的子目录下,向上转要硬编写返回和转向路径.
      ~,不过.net支持得不太好4.如果遇到页面 Session("")的超时?如何检测呢?
     写个检测类,如楼上朋友写的.也可以周期性定时检测!另外,最好是在新窗口中登录,这样,在原窗口所填的数据就不会丢(看你验证是如何写的了).
      

  5.   

    谢谢大家的帮助,不过我对以上方法有考虑过!
    个人现在解决想法如下,如果有更好或我的错语之处,请告之:
    把错误编码和内容定义在error.xml中.
    然后定义一个继承于applicationException的类(MyException).
    再定义二个枚举吧
    enum Target{ Self=0,Parent}// 用于确认是在IFRAME中还是一般窗口.
    enum Errors{AccessDeny=1001,....}//所有的异常编码.
    在每个页面中throw new MyException("Error Message",Target.Self);
    然后在MyException的构造里都调用 
    ProccessException()方法(此方法由构造函处调用,统一化参数,可以重载多个版本).
    ProccessException(Errors error,Target target)
    {
        if(target == Target.Self)
        {
            Response.write("<script>window.location.href=error.aspx?c="+error.ToString()+";</script>");
        }else
        { 
            Response.write("<script>window.parent.location.href=...;</script>");
        }
        return;
    }最后在error.aspx 的Page_OnLoad()方法中取C参数.
    同时把error.xml全部内容读入并缓存在自定集合或hashtable中用C码作为KEY.
    然后直接返回相应的错误内容.(根据传入的C码,配对相应的节点).
    最后就直接显示.当然错误页可以用history.go(-1)或传递需要返回的参数给Error.aspx
    sample:
    public Page_OnLoad(object sender ,EventArgs e)
    {
         if(Request["C"] != null)
         {
             ShowErrors(Request["C"]);
         }
    }private void ShowErrors(string errorCode)
    {
      if(errorHash == null) InitErrorList();//初始化错误内容.同时加入Cache中.
      if(errorHash .Contains(errorCode)) //如果不存在说明错误没有定义,可以弄个默认的.
      {
           strErrorDetails = errorHash.Get(C).value;
           this.lblErrorDetails.Text = strErrorDetails;
      }
    }以上方法还没有经过完整测试,尚在构思之中.只是上来看到大家这么热心回复.
    我也就冒昧的把自已这几天思索的结果奉上,如果大家认为有什么改进或不对的
    请转告.谢谢!
      

  6.   

    超时的问题没什么好的办法...
    HTTP就这个样...无状态协议嘛返回错误页的处理很简单
    登陆处理完以后 转到request.RawUrl 就可以了
    或者你用FORM验证,自动跳转回前一个页面
      

  7.   

    to: sunchaohuang
    如果一个页面在onload时就发生错误,那么取得它再返回这就不好办了?其实感觉要解决的问题很多(可能是我很菜的原因).;(
    超时的解决办法我是靠 JavaScript和AJAX实现,办法如下:function CheckSessionState()
    {
       window.setInterval("IsTimeOut();",199990);
    }

    function IsTimeOut()
    {
        // AJAXj里注册了 main,同时可以不要再调用callback,直接在这处理返回值.
        main.IsTimeOut(CallBack);
    }

    function CallBack(r)
    {
        if(r.error != null)
        {
    alert(r.error);
    return;
        }else{
    var isTimeOutNow = r.value;

    if(isTimeOutNow == 0)
    {
    alert("登陆已超时,请重新登陆!");
    window.parent.location.href="./userlogin.aspx";
    }
    return;
       }
    }
    <body onload="checkSessionState();">
    通过这样,到时就会自动用js弹出超时的信息,并且退到登陆界面.