Turn on more accessible mode
Skip Ribbon Commands
Skip to main content
Turn on Animations

Como prevenir errores fatales en WebParts

WebParts


Escribir WebParts es fácil, pero escribir WebParts que no arruinen la instalación de SPS/WSS cuando algo sale mal es menos fácil. Algunos trucos para evitar catástrofes. (Basado en un artículo de Barry Kouda)
Autor: Gustavo

Cuando el código de una WebPart comete un error, y el código no lo atrapa de una forma elegante, toda la página de SPS\WSS deja de funcionar y muestra la página de error por defecto:

El código para producir el error ha sido añadido a algunos renglones de código que solamente dejan ver un texto en la pantalla

output.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
output.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "14");
output.RenderBeginTag(HtmlTextWriterTag.Div);
output.Write("Escribiendo en HTML");
output.RenderEndTag();
//genera un error en la pagina
throw new ApplicationException("Algo ha dejado de funcionar...");

Usando las técnicas conocidas de DotNet para atrapar errores, se necesita integrar el código entre un estamento "try/catch"

try
{
  output.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
  output.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "14");
  output.RenderBeginTag(HtmlTextWriterTag.Div);
  output.Write("Escribiendo en HTML");
  output.RenderEndTag();
  //genera un error en la pagina
  throw new ApplicationException("Algo ha dejado de funcionar...");
}
catch(Exception ex)
{
  output.Write("Error en la WebPart: " + ex.Message);
}

Pero esto de todas formas no produce el resultado deseado, por la simple razón de que antes de que el error ocurriera, ya se había escrito algo en la pantalla. Si en lugar del sencillo código del ejemplo se ha estado intentando escribir una tabla de HTML, y el error ocurre antes de cerrar correctamente la tabla, puede ocurrir que toda la pagina sea interpretada de una forma errónea.

La mejor forma de evitar el problema es escribiendo primero en una reserva, y luego enviar todo en un solo paso a la pantalla

protected override void RenderWebPart(HtmlTextWriter output)
{
  // crea una reserva
  StringBuilder myBuffer = new StringBuilder(10240);
  StringWriter myInnerWriter = new StringWriter(myBuffer);
  HtmlTextWriter myBufferWriter = new HtmlTextWriter(myInnerWriter);
  try
  {
    myBufferWriter.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
    myBufferWriter.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "14");
    myBufferWriter.RenderBeginTag(HtmlTextWriterTag.Div);
    myBufferWriter.Write("Escribiendo en HTML");
    myBufferWriter.RenderEndTag();
    //genera un error en la pagina
    throw new ApplicationException("Algo ha dejado de funcionar...");
    // Escribe la reserva al browser si no ha ocurrido un error
    output.Write(myBuffer.ToString());
  }
  catch(Exception ex)
  {
    output.Write("Error en la WebPart: " + ex.Message);
  }
}

Lo que produce el efecto deseado