在Razor ViewEngine中调用解析方法时,编译错误被抛出为包含错误列表的TemplateComplilationException。这些错误指的是临时文件名,但这些文件在您可以访问它们之前已被删除。
static void Main(string[] args)
{
var service = TemplateServiceFactory.CreateTemplateService(Language.CSharp, true);
string result = "";
try
{
result = service.Parse("Hello @DateTime.NowXX ");
}
catch (TemplateCompilationException ex)
{
foreach (var error in ex.Errors)
if (!string.IsNullOrEmpty(error.FileName))
Console.WriteLine( File.ReadAllText( error.FileName ));
} // ^^^^ File does not exist!
Console.WriteLine( result );
Console.ReadKey();
}(一个小背景)我正在使用没有MVC的Razor引擎“独立”。当我调用Parse时,我希望获得尽可能多的详细信息以显示给用户。
发布于 2012-01-17 00:05:53
RazorEngine的TemplateCompilationException是一个包装包含CompilerError对象的CompilerErrorCollection的类,因此您可以从TemplateCompilationException CompilerError对象获得的最多细节是它们各自的属性,这似乎足以进行调试。考虑并尝试这个例子
try
{
Razor.Parse("My erroneous @DateTime.Now.foo()");
}
catch(TemplateCompilationException ex)
{
foreach(var error in ex.Errors)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Compile Error Num: \t" + error.ErrorNumber);
sb.AppendLine("Error Text:\n\t" + error.ErrorText);
Console.WriteLine(sb.ToString());
}
Console.WriteLine("Erroneous Template:\n\t" + ex.Template);
}当我运行我的示例时,这是我得到的结果,它告诉您遇到的错误,您可以转储模板数据以供用户参考。
Compile Error Num: CS1061
Error Text:
'System.DateTime' does not contain a definition for 'foo' and no
extension method 'foo' accepting a first argument of type
'System.DateTime' could be found (are you missing a using directive
or an assembly reference?)
Erroneous Template:
My erroneous @DateTime.Now.foo()发布于 2012-01-20 20:26:17
当前的v2.1版本不提供吐出源代码的功能。在新的v3代码库中有一个调试功能,允许将源代码推出。默认情况下,它不会这样做,因为我试图使代码尽可能地高性能(并且两次生成代码(一次作为CodeDom,一次作为字符串)并不理想)。您需要在配置中启用Debug标志:
var config = new TemplateServiceConfiguration { Debug = true };
var service = new TemplateService(config);这将使源代码能够在抛出异常时被读取。
有趣的是,通过使用v3代码库测试Roslyn编译器基础设施,它接受字符串源而不是CodeDom,所以我可能会在未来更改为使用它而不是直接使用CodeDom -这反过来意味着我们可以直接访问源代码,而不必担心启用任何可能会被弃用的Debug标志。
在Nuget (Install-Package RazorEngine)上提供了v3 (目前是v3.0.7beta)。上周末我的目标是RTW,但一直没有抽出时间。
https://stackoverflow.com/questions/8851977
复制相似问题