2009-10-16 8 views
5

Estoy usando la biblioteca codeplex NVelocity en .NET y quiero detectar un error cuando ejecuto el método Evalute en la instancia de VelocityEngine y no se encuentra uno de los parámetros en el texto de la plantilla.Cómo atrapar el error InvalidReference en NVelocity

¿Cómo puedo obtener esto?

Encontré IInvalidReferenceEventHandler interfaz en el espacio de nombres NVelocity.App.Event pero no encuentro ninguna información sobre cómo usarlo. Cualquier ayuda será apreciada.

Respuesta

3

He encontrado la solución.

He hecho clases manejador de sucesos:

public class NVelocityEventHandler : IInvalidReferenceEventHandler, IMethodExceptionEventHandler 
{ 
     #region IInvalidReferenceEventHandler Members 

     public object InvalidGetMethod(NVelocity.Context.IContext context, string reference, object object_Renamed, string property, NVelocity.Util.Introspection.Info info) 
     { 
      return "InvalidGetMethod:" + reference; 
     } 

     public object InvalidMethod(NVelocity.Context.IContext context, string reference, object object_Renamed, string method, NVelocity.Util.Introspection.Info info) 
     { 
      return "InvalidMethod:" + reference; 
     } 

     public bool InvalidSetMethod(NVelocity.Context.IContext context, string leftreference, string rightreference, NVelocity.Util.Introspection.Info info) 
     { 
      return true; 
     } 

     #endregion 

     #region IMethodExceptionEventHandler Members 

     object IMethodExceptionEventHandler.MethodException(Type claz, string method, Exception e) 
     { 
      return "MethodException:" + method; 
     } 

     #endregion 
} 

Entonces lo uso en el siguiente código:

StringWriter writer = new StringWriter(); 
NVelocity.App.VelocityEngine eng = new NVelocity.App.VelocityEngine(); 
try 
{ 
    NVelocityEventHandler te = new NVelocityEventHandler(); 
    EventCartridge ec = new EventCartridge(); 
    ec.AddEventHandler(te); 
    VelocityContext vc = new VelocityContext((IDictionary)parameters); 
    ec.AttachToContext(vc); 
    eng.Evaluate(vc, writer, "templatestring", template); 
} 
catch (ParseErrorException pe) 
{ 
    return pe.Message; 
} 
catch (MethodInvocationException mi) 
{ 
    return mi.Message; 
} 
Cuestiones relacionadas