StringTemplate.Net 学习笔记(11):自定义错误处理

ST通过实现IStringTemplateErrorListener接口的类型来进行错误处理,它仅包括2个方法定义(错误与警告):

	public interface IStringTemplateErrorListener
	{
	    void Error(string msg, Exception e);
	    void Warning(string msg);
	}

通过实现此接口,可以自定义错误的处理,如输出到文件(ST默认的错误处理都是输出到控制台):

	public class MyErrorListener : IStringTemplateErrorListener
	{
		public void Error(string message, Exception e)
		{
			WriteToFile("Error:" + message);
			if (e != null)
			{
				WriteToFile("Error StackTrace:" + e.StackTrace);
			}
		}
		
		public void Warning(string message)
		{
			WriteToFile("Warning:" + message);
		}
		
		private void WriteToFile(string message)
		{
			string fileName = DateTime.Now.ToString("yyyy-MM-dd") + ".sterr";
			message = string.Format("{0}:{1}\n\r", DateTime.Now, message);
			File.AppendAllText(fileName, message);
		}
	}

演示代码一(加载模板文件):

	//模板文件为bin\debug\templates\t1.st,内容:
	//$no:{$it.first$}$


	StringTemplateGroup group = new StringTemplateGroup("g1", AppDomain.CurrentDomain.BaseDirectory + "Templates");
	group.ErrorListener = new MyErrorListener();			
	StringTemplate st = group.GetInstanceOf("t1");
	Console.WriteLine(st.ToString());

运行以上代码,可以看到bin\debug目录生成了以当前日期命名的文件2010-05-03.sterr,并把错误内容写入到了文件里。

演示代码二(加载模板组文件):

	/*模板组文件为:bin\debug\templates\g1.stg,内容:
	group g1;
	t1(no) ::= <<
		<no:{<it.first>}>
	>>
	*/

	StringTemplateGroup.RegisterGroupLoader(new LWMEGroupLoader(new string[]{AppDomain.CurrentDomain.BaseDirectory + "Templates"}, new MyErrorListener()));//LWMEGroupLoader看http://www.cnblogs.com/lwme/archive/2010/05/01/1725723.html
	StringTemplateGroup group = StringTemplateGroup.LoadGroup("g1");
	StringTemplate st = group.GetInstanceOf("t1");
	Console.WriteLine(st.ToString());

同样把错误写入到了文件里。

需要注意的是,必须先设置listener,再加载文件,否则不会按照设置的listener处理错误,这是因为加载的时候就已经对模板进行parse处理了。

如下使用方式都是错误的:

	//错误使用方式一
	StringTemplate st1 = new StringTemplate("$no:{$it.first$}$");//已经psrse
	st1.ErrorListener = new MyErrorListener();

	//错误使用方式二
	StringTemplateGroup.RegisterGroupLoader(new LWMEGroupLoader(new string[]{AppDomain.CurrentDomain.BaseDirectory + "Templates"}));
	StringTemplateGroup group = StringTemplateGroup.LoadGroup("g1");//已经parse
	group.ErrorListener = new MyErrorListener();
	StringTemplate st = group.GetInstanceOf("t1");

Ok,内容比较简单,本文结束。

本文地址:http://www.cnblogs.com/lwme/archive/2010/05/03/1726298.html

原文地址:https://www.cnblogs.com/lwme/p/1726298.html