2012-06-13 8 views
10

Bir dış kitaplık bir LINQ sağlayıcısı içeriyorsa ve bir dinamik ifade ağacı yürütürken bir istisna atarsa, bu ifade atıldığında nasıl kırılabilirim?Derlenmiş bir ifade ağacında nasıl bir hata ayıklama yapabilirim?

Örneğin, bana IQueryable ait Max<TSource, TResult>() yöntemini çağırmak için izin veren bir üçüncü taraf LINQ2CRM sağlayıcı, kullanmak, ancak bir InvalidCastException atar, ben, istisnası atılır yerinde kırmaya başarısız olmasına zorlaştırıyordu yığın izlemeyi gözden geçirin çünkü hata ayıklayıcısını kodumda kırdığında zaten çözülmüştür. Bahsedilen istisna için "mola atma" ayarlıyorum. Benim ayıklama ayarları şunlardır: Tam olarak ben kırmak isterdim nerede

enter image description here


açıklama. I , LINQ İfadesinin yanında kırılmak istemiyor, ancak bunun yerine, İfade ağacı çalıştırıldığında kırılmak istiyorum veya başka bir deyişle, IQueryable uzantı yöntemi Max() LINQ sağlayıcısı tarafından sağlanan geçersiz kılmayı çağırdığında. stacktrace üst içimde kırmak ister (veya adım adım, ya da her neyse) nerede olduğu şöyle görünür:

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

bu yöntemlerden birinde bir lambda ifade kesiminde bir kesme noktası sopa demek? –

+0

[Bu yardımcı olur] (http://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/) emin değilim, ancak şimdi bir arama yapıyorum Bu ilginç olduğu gibi. Bütün yollar LinqPad'e gidiyor gibi görünüyor. Kaynak kodu olmadan nasıl kırılabildiğini göremiyorum, ve sonra kaynağa sahip olduğunuzda, sadece 'Max' sorumlu sağlayıcının bir parçası değil mi? –

+0

[İfade Ağaçları] (http://msdn.microsoft.com/en-us/library/bb397951.aspx) MSDN bölümünde ayrıca [Debugging İfade Ağaçları] için bir bölümü vardır (http://msdn.microsoft.com/ en-us/kütüphane/ee725345). Bence burayı aramaktan vazgeçip işime geri dönmeliyim ;-) –

cevap

4
Ben ancak, sorunun anlaşılması yerine aslında on line kırma olmayabilir

(mümkün görünmüyorsa), ifade ağacınızın içine bir try-catch koymak ve istisna günlüğe kaydetmek için yeterli olur mu?

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

Konsol çıkışı:

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)