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 に答える