3

我正在使用该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在第 127 行创建了一个没有 pdb 信息的程序集,所以这将不可能知道异常发生在哪里。我对吗?

4

2 回答 2

1

在某些版本的 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();
}
于 2017-10-12T14:35:30.870 回答
0

在这种情况下,您可能需要查看AggregateException.InnerExceptions属性内部的信息。

于 2016-05-09T21:08:36.160 回答