2016-05-09 6 views
3

Ich evaluiere ein Skript mit der CSharpScript.EvaluatyAsync<T> Methode und übergibt einige C# -Code. Ich kann die Zeilennummer von Fehlern leicht sehen, wenn es ein Analyseproblem gibt, z. ein Syntaxfehler, aber wenn es eine Laufzeitausnahme gibt, bekomme ich nur eine AggregateException, die meine Ausnahme (NullReferenceException) in diesem Fall einwickelt, aber es gibt keine Ahnung, wie man die Zeilennummer für mich bekommt (3 in diesem Beispiel unten).Ausnahmelinie Nummer in CSharpScript.EvaluateAsync

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:

Ich habe dies erforscht und festgestellt, dass der Scripting-API eine Baugruppe ohne PDB-Informationen erzeugt here line 127 so wird dies nicht möglich sein, zu wissen, wo die Ausnahme passiert ist. Habe ich recht?

+1

[Mein triviale Versuch, den Code, den Sie wies Festsetzung] (https://github.com/svick/roslyn/commit/5030b3cce03e57ab4d5a36eb1d113ba2d36f7c9b) hat nichts geändert, also schlage ich vor, dass Sie dies als Problem beim Roslyn-Repo einreichen. – svick

Antwort

1

In einigen CSharpScript-Versionen hat das Team eine Lösung hinzugefügt: Jetzt können Sie ScriptOptions.Default.WithEmitDebugInformation(true) zur EvaluateAsync-Methode hinzufügen.

Siehe meine Testfälle unten, wie die Ausnahme Zeilennummer zu extrahieren:

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

In diesem Fall werden Sie wahrscheinlich die Informationen innerhalb der AggregateException.InnerExceptions Eigenschaft betrachten.

+0

Ich sehe keine Zeilennummer Informationen in der "NullReferenceException" das ist die 'InnerException'. – svick