CSharpScript.EvaluateAsync 中的异常行号
Exception line number in CSharpScript.EvaluateAsync
我正在使用 CSharpScript.EvaluatyAsync<T>
方法评估脚本并传递一些 C# 代码。
当出现解析问题时,我可以很容易地看到错误的行号,例如一个语法错误,但是当出现运行时异常时,在这种情况下,我得到的只是一个 AggregateException
包装我的异常 (NullReferenceException
),但是不知道如何为我获取行号 ( 3 在下面的例子中)。
Console.WriteLine(CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result);
编辑:
我一直在研究这个,发现脚本 API 创建了一个没有 pdb 信息的程序集 here line 127 所以这将无法知道异常发生的位置。我说的对吗?
在这种情况下,您可能需要查看 AggregateException.InnerExceptions
属性.
中的信息
在某些版本的 CSharpScript 中,团队添加了一个解决方案:现在您可以将 ScriptOptions.Default.WithEmitDebugInformation(true)
添加到 EvaluateAsync
方法。
查看下面我的测试用例,了解如何提取异常行号:
[TestMethod]
public void LineNumberInStackTrace()
{
try
{
var result = CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code", ScriptOptions.Default.WithEmitDebugInformation(true)).Result;
}
catch (AggregateException e)
{
if (e.InnerException is NullReferenceException inner)
{
var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal) + 6;
var lineNumberStr = inner.StackTrace.Substring(
startIndex, inner.StackTrace.IndexOf("\r", StringComparison.Ordinal) - startIndex);
var lineNumber = Int32.Parse(lineNumberStr);
Assert.AreEqual(3, lineNumber);
return;
}
}
Assert.Fail();
}
[TestMethod]
public void LineNumberNotInStackTrace()
{
try
{
var result = CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result;
}
catch (AggregateException e)
{
if (e.InnerException is NullReferenceException inner)
{
var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal);
Assert.AreEqual(-1, startIndex);
return;
}
}
Assert.Fail();
}
我正在使用 CSharpScript.EvaluatyAsync<T>
方法评估脚本并传递一些 C# 代码。
当出现解析问题时,我可以很容易地看到错误的行号,例如一个语法错误,但是当出现运行时异常时,在这种情况下,我得到的只是一个 AggregateException
包装我的异常 (NullReferenceException
),但是不知道如何为我获取行号 ( 3 在下面的例子中)。
Console.WriteLine(CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result);
编辑:
我一直在研究这个,发现脚本 API 创建了一个没有 pdb 信息的程序集 here line 127 所以这将无法知道异常发生的位置。我说的对吗?
在这种情况下,您可能需要查看 AggregateException.InnerExceptions
属性.
在某些版本的 CSharpScript 中,团队添加了一个解决方案:现在您可以将 ScriptOptions.Default.WithEmitDebugInformation(true)
添加到 EvaluateAsync
方法。
查看下面我的测试用例,了解如何提取异常行号:
[TestMethod]
public void LineNumberInStackTrace()
{
try
{
var result = CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code", ScriptOptions.Default.WithEmitDebugInformation(true)).Result;
}
catch (AggregateException e)
{
if (e.InnerException is NullReferenceException inner)
{
var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal) + 6;
var lineNumberStr = inner.StackTrace.Substring(
startIndex, inner.StackTrace.IndexOf("\r", StringComparison.Ordinal) - startIndex);
var lineNumber = Int32.Parse(lineNumberStr);
Assert.AreEqual(3, lineNumber);
return;
}
}
Assert.Fail();
}
[TestMethod]
public void LineNumberNotInStackTrace()
{
try
{
var result = CSharpScript.EvaluateAsync<int>(
@"string s = null;
// some comment at line 2
var upper = s.ToUpper(); // Null reference exception at line 3
// more code").Result;
}
catch (AggregateException e)
{
if (e.InnerException is NullReferenceException inner)
{
var startIndex = inner.StackTrace.IndexOf(":line ", StringComparison.Ordinal);
Assert.AreEqual(-1, startIndex);
return;
}
}
Assert.Fail();
}