Introduction
When delivering webparts you need to have an approach on how to handle errors so that the the webpart "dies" in a nice way and can also communicate the problem to the administrators in a controlled way. This article explains the approach I have used. The approach used here is to catch the error in CreateChildControl
and then display the error during the rendering in LiteralControls
.
Webpart overrides
If you inherit from System.Web.UI.WebControls.WebParts.Webpart you should override the following methods:
CreateChildControls
: called by the ASP.NET page Framework to notify server controls that use composition-based implementation to create any child controls that they contain in preparation for posting back or rendering. Render
: renders the control to the specified HTML writer.
Who should catch what we throw...
The problem I have seen is that if you don't handle errors in a controlled way, the whole SharePoint page gets corrupt which is not acceptable. We should have the following goals of how we handle errors:
- Die in a graceful way
If a webpart just throws an error, the Sharepoint page is not usable - Report something back to the end user
We need to tell the end user that we have a problem - Send more error information for troubleshooting
We need to have the possibility to have more extensive error reporting for the System Administrator...
My Approach: Coding a webpart
To at least "die" in a controlled way, I have implemented the following approach. I am still missing some good guidelines on how to do Tracing and Event logging inside Sharepoint 2007 from Microsoft.
- Create a private variable to store the
Exception
inside the webpart
private Exception childException = null;
- In
CreateChildControls
, have a try
/catch
and catch the error in the childException
variable
try
{
base.CreateChildControls();
.....
}
catch (Exception exp)
{
HttpContext ctx = HttpContext.Current;
ctx.Trace.Warn(ex.ToString());
childException = ex;
}
- In
Render
check using try
/catch
and catch the error in the childException
variable and then display the result in the page by using labels..
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if (childException != null)
displayErrorMsg(writer, childException);
try
{
...
...
...
}
catch (Exception ex)
{
displayErrorMsg(writer, ex);
}
where
private void displayErrorMsg(HtmlTextWriter writer, Exception ex)
{
this.Controls.Clear();
this.Controls.Add(new LiteralControl(ex.Message));
if (ex.InnerException != null)
{
this.Controls.Add(new LiteralControl(ex.InnerException.Message));
}
this.Controls.Add(new LiteralControl());
base.Render(writer);
HttpContext ctx = HttpContext.Current;
ctx.Trace.Warn(ex.ToString());
}
Points of Interest
After working with SharePoint 2007, I miss good information sources regarding creating webparts. Most examples are just of the "Hello World" complexity which is useless if you would like to deliver something for production.
History
- 11th April, 2007: Created