如何处理运行ASP.NET应用程序时遇到的错误

时间:2011-11-23 03:04:49

标签: c# asp.net visual-studio

我正在使用VS2005 C#,我有一个应用程序,它有一些功能,如列表,编辑数据库,数据的导入和导出。

但是,我不知道捕获和处理错误。下面是导入的文件列与数据库不匹配时遇到的错误的示例屏幕截图,并阻止应用程序运行并直接指向我的后端代码: enter image description here

Preiovusly我正在使用Netbeans,在Netbeans中我更清楚,因为他们总是用错误代码指定每个错误,所以我能够为每个错误代码分配一个网页。

我可以知道如何识别这些错误以及如何处理它们?是否可以在遇到错误时分配网页重定向?

谢谢

5 个答案:

答案 0 :(得分:5)

在ASP.NET中处理异常有三种方法:

            1. All the exceptions will catch  page level.
            2. All the exceptions will catch entire site level.
            3. All the exceptions will catch by using "web.config" file

示例:

1.页面级别的异常处理。

       public void Page_Error(object obj, EventArgs ergs)
        {

            Exception objErr = Server.GetLastError().GetBaseException();
            string err = "Error Caught in Application_Error event " +    
                         System.Environment.NewLine + "Error in: " + Request.Url.ToString() +
                         System.Environment.NewLine + "Error Occured Time:" + DateTime.Now +
                         System.Environment.NewLine + "Error Message:" + objErr.Message.ToString() +
                         System.Environment.NewLine + "Stack Trace:" + objErr.StackTrace.ToString();
            Response.Write(err);
            Server.ClearError();
            Response.Redirect("~/customError.aspx");
        }

2.网站级别的异常处理。

    protected void Application_Error(object sender, EventArgs e)
        {
            Exception objErr = Server.GetLastError().GetBaseException();
            TraceExceptions objExceptionInsert = new  TraceExceptions();
            objExceptionInsert.StackTrace = objErr.StackTrace;
            objExceptionInsert.Exception = objErr.Message;
            objExceptionInsert.Page = Request.Url.AbsolutePath;
           //Inserting exception into the database
            int exceptioncode = Utilities.TraceException(objExceptionInsert);
            Server.ClearError();
           //Redirecting to common exception page
            string url = "~/Common/Exceptions.aspx?ExceptionCode=" + exceptioncode;
            Response.Redirect(url);

        }

3.使用web.config在网站级别处理异常。

web.config文件的customErrors元素是针对未处理错误的最后一道防线。如果您有其他错误处理程序,例如Page_Error subs的Application_Error,则首先调用它们。如果他们没有执行Response.Redirect或Server.ClearError,您应该被带到web.config中定义的页面。在web.config文件中,您可以处理特定的错误代码(500,404等),或者您可以使用一个页面来处理所有错误。这是此方法与其他方法之间的主要区别(尽管您可以通过使用其他方法执行各种Response.Redirects来模拟此方法)。打开web.config文件。 customErrors部分使用以下格式:

<customErrors defaultRedirect="url" mode="On|Off|RemoteOnly">
   <error statusCode="statuscode" redirect="url"/>
</customErrors>

以下是有关“mode”属性的一些重要信息: “On”指定启用自定义错误。如果未指定defaultRedirect,则用户会看到一般错误。

“关闭”指定禁用自定义错误。这样可以显示详细错误。

“RemoteOnly”指定仅向远程客户端显示自定义错误,并向本地主机显示ASP.NET错误。这是默认值。

默认情况下,创建Web应用程序时,该部分将如下所示。

<customErrors mode="RemoteOnly" 

答案 1 :(得分:2)

您可以在未处理的错误上重定向用户。请查看MSDN文章 - Complete Example for Error Handlers

PS:阅读代码项目文章 - Exception Handling Best Practices in .NET

答案 2 :(得分:2)

有一篇易于理解的文章here

here

在最基本的情况下,.NET中的错误处理是通过try ... catch ... finally结构完成的,类似于Java。您提到过使用NetBeans,因此我假设您熟悉使用这些结构的Java异常处理,因此一旦您了解了基础知识,它应该是一个相当简单的过渡。

捕获异常代码和异常类型之间存在差异。例如,在.NET中,您可能会获得System.NullReferenceExceptionFileNotFoundException。在大多数情况下,异常名称非常明确,这使得理解错误更容易。这是不同的习惯。

屏幕截图中的错误是OleDbException,这意味着OleDb命令,连接等出现问题。您可以单击“更多详细信息”。

此外,一旦你知道了Exception类型,最好看的第一个位置是在MSDN上,你可以在那里找到关于原因,解决方案等的非常好的文档。例如,你的错误是这里介绍:http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbexception.aspx

最后,如果您在屏幕截图中注意到,错误对话框中包含“在线搜索更多帮助”的链接。这通常会将您带到需要修改代码的位置。

答案 3 :(得分:2)

您可以使用Application_Error文件中的Global.asax事件处理程序来捕获ASP.Net应用程序中的所有未处理错误。

    protected void Application_Error(Object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError().InnerException;

        Application["Ex"] = ex;
        Response.Redirect("ErrorPage.aspx")
    }

其中ErrorPage.aspx获取Ex值并显示或处理它。还有this site的另一个例子。

此外,从您给出的屏幕截图中,您可以单击View Detail链接,您将获得调用堆栈,内部异常(如果有)以及任何其他有助于您解决的信息这个问题。

答案 4 :(得分:2)

错误捕获在c#中相当紧张,类似于:

try{
    //stuff you think might fail here, for instance the stuff inside your using statement
}
catch(Exception e){
    Response.Redirect("/myErrorPage.aspx?error=" + e.Message);
}

一旦发现异常,您可以从异常对象中获取有关它的各种信息(在本例中为e)