在服务器端自定义异常处理
在页面上放置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又该未定义了,呵呵