Hata ayıklayıcıyı atıldığında ve yakalandığında BU istisnada durdurmayın


92

Araçlarda / istisnalarda, bir istisna atıldığında hata ayıklayıcının durması seçeneğini ayarladım. Yakalanıp yakalanmadığı.

Bu kuralın bir istisnasını nasıl dışlarım? Kodumun bir yerinde, program mantığının bir parçası olan yakalanmış bir istisna var. Bu nedenle, bu istisnanın her vurulduğunda hata ayıklayıcıyı durdurmasını istemiyorum.

Örnek: 344. satırdaki boş referans istisnasını (yakalanan) yok saymak istiyorum. Diğer tüm istisnalarda durmak istiyorum


6
Bu istisna programlama mantığınızın bir parçası olduğunda (bunu gerçekten bu şekilde uygulamak zorunda olup olmadığınızı düşünün) - o zaman en azından kendi oluşturduğunuz, türetilmiş bir istisna olmalıdır. Bu şekilde Brian'ın çözümünü uygulayabilirsiniz.
tanascius


2
@tanascius - +1 Çoğu durumda katılıyorum İstisnalar mantıklı bir karar için en iyi yol değildir; ancak bazı durumlarda, örneğin işleme istisnalarının serileştirilmesinin kaldırılması bazen kaçınılmazdır, bu nedenle fırlat> yakala> tutacağı tek mantıklı seçenektir.
jpierson

2
@Ando üzgünüm benim hatam. Aynı anda birden çok sekmeyi yönetmek etkilidir, ancak her zaman doğru değildir.

3
@tanascius: Yanıt olarak kendi çerçevenizi atmadan önce bilinen bir çerçeve istisnasını yakalamanız gerekebilir. Öneriniz her zaman mümkün değildir.
Dan Puzey

Yanıtlar:


40

Doğru hatırlıyorsam DebuggerStepThrough, istisnanın ateşlenmesini istemediğiniz kodu içeren yöntemde bir öznitelik kullanabilirsiniz . Sanırım bir yöntemde can sıkıcı istisnayı ateşleyen kodu izole edebilir ve onu öznitelikle süsleyebilirsiniz.


31
Malinger'ın cevabına ve benim deneyimime göre, bu cevap yanlış gibi görünüyor. DebuggerStepThroughNitelik ilk şansını istisnalar dışında Ayıklayıcı'nın davranışını etkilemez.
Michael Petrotta

5
@Tim, test ettim ve durmadı. cevabımı kontrol et: stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler

1
+1, saf .NET 4.0 için VS2010'da ve işlenmeyen istisnalar için Silverlight 4 kodunda çalışır.
Mike Post

6
Önemli not: Bu, zaman uyumsuz bekleme tipi yöntemler için çalışmaz. Daha fazlası burada
i3arnon

8
MSDN'e göre, DebuggerStepThroughözniteliğin CLR için bir anlamı yoktur. Hata ayıklayıcılar tarafından yorumlanır. Güvenilir durumlarda çeşitli altında çalışmıyor gibi görünüyor ve bu DebuggerHiddengüvenilir çalışacaktır stackoverflow.com/a/3455100/141172
Eric J.

65

DebuggerHidden senin arkadaşın!

Ortak dil çalışma zamanı, bu özniteliğe hiçbir anlambilim eklemez. Kaynak kodu hata ayıklayıcıları tarafından kullanılmak üzere sağlanır. Örneğin, Visual Studio 2005 hata ayıklayıcı, bu öznitelikle işaretlenmiş bir yöntemde durmaz ve yöntemde bir kesme noktasının ayarlanmasına izin vermez. Visual Studio 2005 hata ayıklayıcı tarafından tanınan diğer hata ayıklayıcı öznitelikleri DebuggerNonUserCodeAttribute ve DebuggerStepThroughAttribute'tur.

VS2010'da test edildi ve harika çalışıyor.

İken DebuggerStepThroughde bazı özel ayıklayıcı sürümleri için iş gibi görünüyor, DebuggerHiddenhem cevaplara açıklamalara dayanarak durumlarda daha geniş bir aralığı için işe görünmektedir.

Her iki seçeneğin şu anda yineleyici blok yöntemleriyle veya zaman uyumsuz / bekleme yöntemleriyle çalışmadığını unutmayın . Bu, daha sonraki bir Visual Studio güncellemesinde düzeltilebilir.


VS2008 üzerinde çalışıyor. Bunu yakalama bloğu da dahil olmak üzere tüm yönteme uygulamalısın, yoksa başka bir yerde kırarsın
Mark Heath

1
Bu özniteliği bir yönteme ekledim ve hata ayıklayıcı bunun yerine arama yöntemini durdurdu. Bir şey mi kaçırıyorum?
Doogal

1
Böyle olması gerekiyor. bundan kaçınmak için, istisnayı halletmeniz gerekecek ... Veya alternatif olarak arayan yöntemi de işaretleyeceksiniz DebuggerHidden...
Shimmy Weitzhandler

1
Unutmayın, DebuggerStepThrough özniteliği istisnaları bozmamak için yeterli olmalıdır. DebuggerHidden, DebuggerNonUserCode ve DebuggerStepThrough Özniteliğinin bir kombinasyonu gibi davranır.
jpierson


14

DebuggerStepThrough, bir dene / yakalama olan bir yöntemde hata ayıklayıcının kırılmasını önlemek için kullanılacak olandır.

Ancak, yalnızca Visual Studio'nun Hata Ayıklama Seçeneklerinin Genel ayarlarında (menü Araçlar / Seçenekler, düğüm Hata Ayıklama / Genel) "Yalnızca Kodumu Etkinleştir (Yalnızca Yönetilen)" seçeneğinin işaretini kaldırmadıysanız çalışır ...

Bu özellik hakkında daha fazla bilgi için http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden, Debugger'ın istisnanın atıldığı yöntemi göstermesini engeller. Bunun yerine, yığın üzerinde o öznitelikle işaretlenmemiş ilk yöntemi gösterecektir ...


1
Bunun artık VS 2015'te varsayılan olarak çalışmadığını unutmayın, nasıl etkinleştirileceğini öğrenmek için VS bloguna bakın
bhh

Ne yazık ki VS 2015 çözümü VS 2019 için çalışmıyor.
Jonathan Allen

13

Diğer yanıtlarda (ve DebuggerNonUserCodeöznitelik gibi diğer yanıtlarda) belirtilen öznitelikler, artık Visual Studio 2015'te varsayılan olarak aynı şekilde çalışmaz. Hata ayıklayıcı, VS'nin eski sürümlerinden farklı olarak, bu özniteliklerle yöntem pazarındaki istisnaları bozar. Davranışlarını değiştiren performans geliştirmeyi kapatmak için bir kayıt defteri ayarını değiştirmeniz gerekir:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Görsel stüdyo blogunda daha fazla bilgi bulunabilir .

(Bu muhtemelen en üstteki cevap için bir yorum olmalı ama yeterli temsilcim yok)


3

Kodunuzda belirli bir yere atılan bir istisnayı ayırt edemezsiniz. Bununla birlikte, belirli bir türdeki istisnaları devre dışı bırakabilirsiniz.

Kendi kodunuz söz konusu istisnayı atarsa, onu uygun olan her şeyden türetilen özel bir istisna yapar ve ardından bu türetilmiş türde hata ayıklamayı devre dışı bırakırdım.

NullReferenceException olarak sistem istisnalarının devre dışı bırakılması, tüm sistemi etkileyecektir ve bu, geliştirme sırasında elbette istenmez.

İstisnalar için iki tür kırılma davranışı olduğunu unutmayın:

  • Atılmış: Seçilirse, bu türden bir istisna atılır atılmaz kesilir
  • Kullanıcı tarafından işlenmeyen: Seçilirse, yalnızca bu türdeki istisna bir dene / yakala tarafından işlenmezse keser.

Sisteminiz kodunuzdaki söz konusu satırı her geçtiğinde kırmama avantajını sağlayacak olan NullReferenceException için 'Atıldı' denetimini kaldırabilirsiniz, ancak yine de işlenmemiş NullReference beklentiniz varsa, sistemi.


3
Visual Studio 2010'daki bir yönteme DebuggerStepThrough özniteliği eklemek, hata ayıklayıcının, yöntem tarafından işlenmeyen bir özel durumu durdurmasını engeller.
Tim Murphy

Test ettim ve engellemiyor; hala duruyor
Shimmy Weitzhandler

1
@Shimmy - Benim için çalışıyor! DebuggerStepThrough'u, atıldığı noktadan istisnanın çağrı yığını içinde görünür olmasını istediğiniz noktaya kadar her yönteme uyguladığınızdan emin olun. İstisnayı yakalar ve tüm yöntemlerin DebuggerStepThrough ile dekore edildiği çağrı hiyerarşisi içinde ele alırsanız, bu istisnada asla VS break görmemelisiniz.
jpierson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.