none
ASP.NET异常处理问题咨询 RRS feed

  • 问题

  • 大家好,我在学习处理asp.net的时找到了以下学习资料:http://support.microsoft.com/kb/306355/zh-cn
    其中提到了三种意外异常的处理:Page_Error 事件、Application_Error 事件以及应用程序配置文件 (Web.config)。

    因为Application_Error 事件可以统一添加来处理,我就尝试用这事件来处理。但完全捕获不到未处理的异常,而在我的asp.net项目中按钮事件比较多,这些都属于Page_Error 事件吗?根据帮助在对应页面添加public void Page_Error(object sender,EventArgs e)事件就没有问题。
    所以我想咨询下Page_Error 事件和Application_Error 事件要如何区分呢,想统一做Page_Error 事件可不可以?遇到意外错误就直接转入我写好的页面。

    还有就是Web.config文件的配置如下时:
    <customErrors mode="On" defaultRedirect="error.aspx" >
    </customErrors>
    为什么在error.aspx里都不能得到上个页面发生的异常呢?得到的异常信息不对,提示这行“Exception ex = Server.GetLastError().GetBaseException();”有错
    error.aspx里的代码:

    protected void Page_Load(object sender, EventArgs e)
        {
                Exception ex = Server.GetLastError().GetBaseException();
                if (ex != null)
                {
                    // 错误的信息
                    this.tbx_EcptInfo.Text = ex.Message;
                    this.tbx_EcptInfo.Text += "\r\n异常详细信息:" + ex.ToString(); ;
                    // 出错的方法名
                    this.tbx_EcptInfo.Text += "\r\n出错的方法名:" + ex.TargetSite.Name;
                    // 出错的类名
                    this.tbx_EcptInfo.Text += "\r\n出错的类名:" + ex.TargetSite.DeclaringType.FullName;
                // 清空最后的错误
                Server.ClearError();
            }
        }

    2013年1月15日 3:41

答案

  • Application_Error会捕获应用程序错误,因此可以捕获页面级错误(只要有错误,应该会有错误)。

    示例中是写日志,并不是直接向页面输出。你可以修改成向页面输出并查看结果:

    using System.Diagnostics;
    protected void Application_Error(object sender, EventArgs e)
    {
    	Exception objErr = Server.GetLastError().GetBaseException();
    	string err =	"Error Caught in Application_Error event\n" +
    			"Error in:" + Request.Url.ToString() +
    			"\nError Message:"+ objErr.Message.ToString() + 
    			"\nStack Trace:"+ objErr.StackTrace.ToString();
    	//写入文件中
               System.IO.File.WriteAllText("c:\\err.txt",err);
    	Server.ClearError();
    	//additional actions...
    } 

    @为什么在error.aspx里都不能得到上个页面发生的异常呢?

    你应该在抛出错误的时候把错误信息存储到Session中,然后方可再Page_Load中取出错误具体信息。


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    • 已标记为答案 幻靈天 2013年1月22日 9:09
    2013年1月15日 13:09
  • 可以上传你的代码吗?到SkyDrive。

    上传代码方法请参考我红色部分签名(点击打开,第三部分)。


    帮助一起改进论坛质量?提交你的意见于此。
    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心


    抱歉,回复晚了

    今天我自己研究了下,好像发现问题所在了:
    因为之前的一些页面我按照功能分类了,保存了在根目录下不同的文件夹里
    当这些页面抛出异常时,好像都找不到根目录下的error.aspx
    因为我在Global.asax里Application_Error(object sender, EventArgs e)事件写的是这样的:Server.Transfer("error.aspx");
    如果把抛出异常的页面复制一份在要目录下就行了,在各个文件夹里找不到这个页面啊。。。
    这个Transfer方法我要怎么指定路径才科学?好像我这样写就ok了。。:Server.Transfer("~/error.aspx");

    2013年1月21日 8:34
  • Server.Transfer("~/error.aspx"); 这样是Transfer到站点根目录下。
    2013年1月22日 2:34

全部回复