2010-05-21 5 views
6

aşağıdaki gibi bir yöntem olup zincir varsa:yöntem zincirleme ve istisnalar

 var abc = new ABC(); 
     abc.method1() 
      .method2() 
      .methodThrowsException() 
      .method3() 
      ; 

I

olarak

public ABC method1() { 
     return this; 
    } 

ve methodThrowsException() olarak, method1()method2() ve method3() tarif ettik varsayarak kod çalıştırırken

public ABC method3() { 
     throw new ArgumentException(); 
    } 
, bu possib

olduğunu Hangi özel kod satırının İstisna'yı attığını bilmek mi yoksa sadece tüm yöntemi zincirleme olarak tek bir satır olarak mı değerlendirecek? Ben basit bir test yapılır ve bunun sadece bir satır olarak hepsini dikkate görünüyor ama Method Chaining ayrı satırlara

koymak yöntemleri de mesajları hata olarak daha kolay ayıklama yapar diyor ve ayıklayıcı kontrolü bir hat üzerinde genellikle olduğunu ettik satır bazında.

Am Ben bir şey eksik veya bu sadece C# için geçerli değildir?

Teşekkür

Düzenleme: burada i anda ne elde:

alt text http://img163.imageshack.us/img163/4503/83077881.png

+1

Resim bağlantı şimdi düzeltebilirim bozuldu çizgisinde olacak? – ahsteele

cevap

6

Kural dışı durum ayrıntılarının bir parçası olarak görüntülenen yığın izine bakarsanız, kodu nasıl biçimlendirdiğiniz önemli olmaksızın istisnanın tam yerini görmelisiniz.

Kodun farklı şekilde biçimlendirilmesi, hata ayıklayıcının belirli bir satırda bir kesme noktası koymanıza izin vermesi durumunda yararlı olur, ancak C# 'de kesme noktaları tek tek ifadelere yerleştirilir, bu gerçekten işe yaramaz. Muhtemelen kesme noktaları yerleştirerek izin vermek için bu gibi bir kod yeniden yazmak gerekir:

var abc = new ABC(); 
var abc1 = abc.method1(); 
var abc2 = abc1.method2(); 
// etc... 

aynı (sizin ekran görüntüsünde) geçerli ifadenin vurgulayarak için de geçerlidir. Bununla birlikte, istisna hakkındaki kesin bilgiler her zaman yığın izlemede kullanılabilir.

1

Visual Studio ayıklayıcı (Mono değil çünkü, sen VS olup Mono kullanarak varsayılmaktadır Bir hata ayıklayıcınız var) kodunuzun yürütmekte olduğu gerçek çizgiyi bilir ve çoğu C/C++ hata ayıklayıcısının yapma eğiliminde olduğu için tüm ifadeleri en yakın noktalı virgülle açmaz. Aynı şekilde, tüm ifadeleri aynı satırına koymuş olsanız bile, VS hangi yöntemi çalıştırdığınızı ve hangisinin istisnayı attığını gösterebilir.

Düzenleme : aslında bir istisna atılan var mı? Sonra istisna yığın izine bakın.

+0

Aslında Mono'nun hata ayıklayıcısı var ancak VS'nin bir – abatishchev

+0

olduğundan çok daha az güç var. Evet, sadece sayfalarına bakarak bunu buldum. –

+0

Düzenlememe bak. –

1

size örnek kodu çalıştırırsanız yığın izleme bildirilen çizgi aslında istisnası atılır hat olup yöntem çağrısının çizgi olduğunu göreceksiniz. VS hata ayıklayıcı da bu satırda durduracak ve yöntem çağrısı üzerinde duracak.

Güncelleme: ekran görüntüsü solundaki yeşil hata görüldüğü gibi çağrı yığını üstündeki değildir. Çağrı yığını penceresini açın (örneğin menü Debug aracılığı ->, Windows -> çağrı yığını) ve çift tıklayın istisnası aslında atılır yer almak için ilk satırı. Çağrı yığındaki ilk yöntem de method3() olacaktır. o ancak Visual Studio IDE için Java IDE'lerinde veya diğer entegre debugger'lar için doğru olabilir, böylece Martin Fowler alıntı genelde hata ayıklama başvurduğu

Not. Yine de, istisna yığınının izine bakarak, soruna neden olan yöntemi kolayca tanımlayabileceksiniz.

1

Sen istisna oluşturulduğu kod kesin çizgiyi ancak (aşağıda numaralandırma bakınız)

  try { 

Line 1  var abc = new ABC(); 
Line 2  abc.method1() 
Line 3   .method2() 
Line 4   .methodThrowsException() 
Line 5   .method3(); 
Line 6 catch(Exception e) 
     { 
      StackTrace t = new StackTrace(e, true); 
     } 

StackTrace 2 olacak özel yöntemi denilen kod satırını görebilirsiniz (yapabilecekleriniz 2 çerçeveleri içerir o olarak) özel stacktrace ya da bir StackTrace nesne oluşturarak bkz

  • özel yöntemi tanımlandığı gibidir hattı olması ve dosya ilk

  • ikinci 2