在服务器端自定义异常处理

在页面上放置ScriptManager和UpdatePanel,并在UpdatePanel里放置两个文本框一个标签和一个按钮,用于输入两个数,并计算相除后的结果,按钮的Click事件如下:

protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            int a = int.Parse(TextBox1.Text);
            int b = int.Parse(TextBox2.Text);
            int res = a / b;
            Label1.Text = res.ToString();
        }
        catch (Exception ex)
        {
            if (TextBox1.Text.Length > 0 && TextBox2.Text.Length > 0)
            {
                ex.Data["ExtraInfo"] = " You can't divide " + TextBox1.Text + " by " + TextBox2.Text + ".";
            }
            throw;
        }
    }

以前真不知道ex.Data["ExtraInfo"] 这种写法,原来可以这样呀!

然后设置ScriptManager的AsyncPostBackError事件:

protected void ScriptManager1_AsyncPostBackError(object sender, Microsoft.Web.UI.AsyncPostBackErrorEventArgs e)
    {
        if (e.Exception.Data["ExtraInfo"] != null)
        {
            ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message + e.Exception.Data["ExtraInfo"].ToString();
        }
        else
        {
            ScriptManager1.AsyncPostBackErrorMessage = "An unspecified error occurred.";
        }
    }

这里就用上e.Exception.Data["ExtraInfo"]了。

编译运行,输入正确时,标签将显示两数相除的结果,当在除数中输入0时,提示错误了,错误信息正是默认的信息e.Exception.Message +自定义的信息" You can't divide " + TextBox1.Text + " by " + TextBox2.Text + "." ,不错吧:)

 在客户端脚本中自定义异常处理

修改上面的例子,在页中加入

        <div id="AlertDiv">
            <div id="AlertMessage">
            </div>
            <br />
            <div id="AlertButtons">
                <input id="OKButton" type="button" value="OK" runat="server" onclick="ClearErrorState()" />
            </div>
        </div>

用来显示错误信息,样式的东西这里就省掉了,看一下脚本:

<script type="text/javascript" language="javascript">
            var divElem = 'AlertDiv';
            var messageElem = 'AlertMessage';
            var bodyTag = 'bodytag';
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
            function ToggleAlertDiv(visString)
            {
                 if (visString == 'hidden')
                 {
                     $get(bodyTag).style.backgroundColor = 'white';                         
                 }
                 else
                 {
                     $get(bodyTag).style.backgroundColor = 'gray';                         
                 }
                 var adiv = $get(divElem);
                 adiv.style.visibility = visString;
            }
            function ClearErrorState() {
                 $get(messageElem).innerHTML = '';
                 ToggleAlertDiv('hidden');                     
            }
            function EndRequestHandler(sender, args)
            {
               if (args.get_error() != undefined)
               {
                   var errorMessage;
                   if (args.get_response().get_statusCode() == '200')
                   {
                       errorMessage = args.get_error().message;
                   }
                   else
                   {
                       errorMessage = 'An unspecified error occurred. ';
                   }
                   args.set_errorHandled(true);
                   ToggleAlertDiv('visible');
                   $get(messageElem).innerHTML = errorMessage;
               }
            }

            </script>

别忘了把body的id设成bodytag,关于这些脚本的解释:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
这句话用来定义PageRequestManager类的endRequest事件处理。

ToggleAlertDiv函数用来设置提示信息的显示或隐藏,并设置背景颜色。

ClearErrorState是点击提示信息中的OK按钮,执行的函数,用于把提示信息清空,并调用ToggleAlertDiv来隐藏提示框。

EndRequestHandler就是PageRequestManager类的endRequest事件处理函数了,当请求完毕时自动触发,这里判断,如果发生了错误,则设置错误信息并显示提示框,关于

args.get_response().get_statusCode()
args.set_errorHandled(true); 

怕是只能记住了:(

对了,别忘了把脚本块放在ScriptManager后面,要不Sys又该未定义了,呵呵

posted on 2007-01-24 11:10  HenryZhang  阅读(278)  评论(0编辑  收藏  举报