Exception line number in CSharpScript.EvaluateAsync

末鹿安然 提交于 2019-12-23 17:23:55

问题


I'm evaluating an script using the CSharpScript.EvaluatyAsync<T> method and passing some C# code. I can easily see the line number of errors when there is a parsing issue, e.g. a syntax error, but when there is a runtime exception all I get is an AggregateException wrapping my exception (NullReferenceException) in this case, but there is no clue of how to get the line number for me (3 in this example below).

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);

EDIT:

I've been researching this and found that the Scripting API creates an assembly without pdb information here line 127 so this will be impossible to know where the exception happened. Am I right?


回答1:


In some version of CSharpScript the team added a solution: now you can add ScriptOptions.Default.WithEmitDebugInformation(true) to the EvaluateAsync method.

See my test cases below on how to extract the exception line number:

[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();
}



回答2:


In this circumstance, you'll probably want to look at the information inside of the AggregateException.InnerExceptions property.



来源:https://stackoverflow.com/questions/37125385/exception-line-number-in-csharpscript-evaluateasync

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!