While error handling in .NET applications and ASP.NET Web applications is fairly straightforward, But it get quite complicated when dealing with solutions built with Microsoft Office SharePoint Server (MOSS) 2007 and Windows SharePoint Services. Because SharePoint comes out-of-the-box with its own custom error handling infrastructure (although it is based on the core functionality provided by ASP.NET).
But if our customer wants a error page on Internet site with our custom Master Page and CSS applied, to provide a beautiful application. We should go for a custom Error Page.
To implement a custom error page for a share point site ,I have followed two different approaches in two different projects.
- Write Custom Http Module to handle Error.
- Handle Error in Master page.
Write Custom Http Module to handle Error.
A) Write a Http Module which will override the out of box Http Module .Handle the error over there and log the error in Application log .Then it redirect the user to the custom error page.You can use following code from my class CustomExceptionHandler.cs
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Web;
using Manas.Common.Infrastructure.Exception;
using
Manas.Common.Infrastructure.Logging;
namespace Manas.ObjectModel
{
/// <summary>
/// This class help to
handle Unhandle Exception by redirecting
/// to a custom Error Page.
/// </summary>
class CustomExceptionHandler
: IHttpModule
{
StringBuilder exceptionMsg = new StringBuilder("");
public void Dispose()
{
}
public void
Init(HttpApplication context)
{
context.Error += new EventHandler(context_Error);
}
void context_Error(object
sender, EventArgs e)
{
try
{
Exception[] unhandledExceptions =
HttpContext.Current.AllErrors;
foreach (Exception
ex in unhandledExceptions)
{
if
(!string.IsNullOrEmpty(ex.Message))
{
exceptionMsg.Append(ex.Message);
exceptionMsg.Append("<br/>");
}
}
HttpContext.Current.Server.ClearError();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Redirect("/Pages/Error.aspx");
}
catch (Exception
ex)
{
LogManager.WriteException(LogContext.UserInterface, ex);
//UserInterfaceException UIex = new
UserInterfaceException(ErrorCodes.ErrorInProductFlags);
//throw (UIex);
}
}
}
}
B) Then you need to create a Custom Error.aspx page and deployed it in appropriate place.
<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Page Language="C#"
%>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages"
%>
<%@ Register Tagprefix="SharePoint"
Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
<%@ Register
Tagprefix="Utilities"
Namespace="Microsoft.SharePoint.Utilities"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
<%@ Import
Namespace="Microsoft.SharePoint"
%>
<%@ Register Tagprefix="SharePoint"
Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
<%@ Register
Tagprefix="Utilities"
Namespace="Microsoft.SharePoint.Utilities"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%> <%@ Import Namespace="Microsoft.SharePoint"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Error</title>
</head>
<body>
<form id="Form1" runat="server">
<div class="container_12">
<div id="masthead">
<div id="logo">
<a href="/" title="Go to site home page">
<img src="/_layouts/images/Krauta/logo.png" />
</a>
</div>
</div>
<div class="grid_12">
<h1>
Error</h1>
<p>
We apologize, but an error
occurred and your request could not be completed.</p>
<p>
This error has been logged. If
you have additional information that you believe
may have caused this error, please
contact technical support.</p>
</div>
</div>
</form>
</body>
</html>
C) To activate custom unhandled exception error page Add the following block in < httpModules> section of web.config. ( in both default and internet zone site)
<httpModules>
<clear />
<add type="Manas.ObjectModel.CustomExceptionHandler,RELL.ObjectModel,Version=1.0.0.0,
Culture=neutral,PublicKeyToken=c8490a3cc3a936e7" name="CustomExceptionHandler"
/>
Handle Error In Master page.
But the above approach some times difficult to handle .because in this case Server.Transfor not working .So I have used other approach in my current project
A) First, we need to create our custom master page class inherits from System.Web.UI.MasterPage .Specifically, in the page Init event, we wire up an event handler for the page Error event. and there we handle our Error as following instructions.
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
namespace Manas.ObjectModel.SharePoint.Utilities
{
[CLSCompliant(false)]
public class ManasMinimalMaster:System.Web.UI.MasterPage
{
private void
Page_Error(object sender, EventArgs e)
{
Logger.LogError(this.Context.Error,
this.Request.Url);
this.Context.ClearError();
this.Server.Transfer("/_layouts/MANAS/Error.aspx");
}
protected void
Page_Init(object sender,EventArgs e)
{
// If an unhandled exception occurs, then
SharePoint transfers the
// request to
/_layouts/error.aspx (via SPRequestModule). This
// causes a couple of issues:
// To avoid these issues, add a custom error
handler for the page
this.Page.Error += new EventHandler(Page_Error);
}
}
}
B) After create a custom MasterPage class.Create your Custom _application.master file which is going to use all over the Share Point site.Your Custom _application.master must be inherits from your CustomMinimalMaster.cs as following instructions.
<%@ Master Language="C#"
Inherits="Manas.ObjectModel.SharePoint.Utilities.ManasMinimalMaster,Manas.ObjectModel.SharePoint,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=9j8b09h7d70e7ku9"%>
<%@ Register Tagprefix="Utilities"
Namespace="Microsoft.SharePoint.Utilities"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
<%@ Import
Namespace="Microsoft.SharePoint"
%>
<%@ Register Tagprefix="SharePoint"
Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint,
Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
C) Create one Error page as specified in Above approach and deployee in appropriate place.
I think it wil help you to manage a custom Error page in share point application.