12

外部ライブラリに LINQ プロバイダーが含まれており、動的式ツリーの実行時に例外がスローされる場合、その式がスローされたときにどうすれば中断できますか?

たとえば、サード パーティの LINQ2CRM プロバイダーを使用すると、 のMax<TSource, TResult>()メソッドを呼び出すことができますIQueryableが、 がスローされるInvalidCastExceptionと、例外がスローされたときにその場でブレークできず、スタック トレースを確認するのが難しくなります。デバッガーが私のコードでそれを壊したときに、すでに巻き戻されています。上記の例外に対して「スロー時にブレーク」を設定しました。私のデバッグ設定は次のとおりです。

ここに画像の説明を入力


正確にどこを壊したいのかを明確にします。LINQ 式の側で中断したくはありませんが、代わりに、式ツリーが実行されたとき、つまり、拡張メソッドIQueryableMax()LINQ プロバイダーによって提供されたオーバーライドを呼び出したときに中断したいと考えています。スタックトレースの上部は次のようになります。これは、内部を破る (またはステップスルーするなど) 場所です。

at XrmLinq.QueryProviderBase.Execute[T](Expression expression)
at System.Linq.Queryable.Max[TSource,TResult](IQueryable`1 source, Expression`1 selector)
4

1 に答える 1

6

私は問題を理解していないかもしれませんが、実際に行を中断する代わりに (これは可能ではないようです)、式ツリー内に try-catch を配置して例外をログに記録するだけで十分でしょうか?

static void Main(string[] args)
{
    var logExceptionMethod = typeof (Program).GetMethod("LogException", BindingFlags.Static | BindingFlags.NonPublic);
    var createFileMethod = typeof (System.IO.File).GetMethod("Create", new[] {typeof(string)});

    // Parameter for the catch block
    var exception = Expression.Parameter(typeof(Exception));

    var expression =
        Expression.TryCatch(
        Expression.Block(typeof(void),
            // Try to create an invalid file
            Expression.Call(createFileMethod, Expression.Constant("abcd/\\"))),

            // Log the exception from the catch                  
            Expression.Catch(exception, Expression.Call(logExceptionMethod, exception)));

    Expression.Lambda<Action>(expression).Compile()();
}

static void LogException(Exception ex)
{
    Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
}

コンソール出力:

The filename, directory name, or volume label syntax is incorrect.

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.File.Create(String path)
at lambda_method(Closure )
于 2012-06-21T01:58:01.507 に答える