Çalışmayan işlenmeyen istisnalarda Visual Studio 2015 kesintisi


114

Visual Studio'nun önceden "İşlenmeyen istisnayı kır" için belirli bir onay kutusu vardı. 2015'te bu kaldırıldı (veya bulamadığım bir yere taşındı). Bu nedenle, kullanıcı düzeyinde bir istisna işleyicisi sağlayamazsam dönüştürülen projelerim artık bozulmuyor. Tüm "atılmış istisnaları" kırmak istemiyorum çünkü belirli olanlarla ilgileniyorum. Tam da belirli bir işleyici sağlayamadığım yer.

Şu anda kodum sadece mevcut prosedürden çıkıyor ve bir sonraki çağrı yığını konumunda yürütmeye devam ediyor, İYİ DEĞİL.

Bunu Visual Studio 2015'te nasıl geri alacağını bilen var mı? Daha dün topluluk sürümüne geçtim.


Visual Studio 2015, Toolveya Windowsekmesi istenen tüm konumlara sahip değilse, önceki sürümünüzden geçerli düzeni koruyacaktır . Sizin durumunuzda, İstisna Ayarları'nı arıyorsunuz .
Greg

4
@greg, paneli nerede bulacağımı bilmediğimden değil. Benim endişem aradığım davranışın o panelde olmaması.
Ted Lowery

burada da aynı problem. Bizim durumumuzda, autofac'in tüm türleri kayıtlı olmadığında bir istisna molası bekliyoruz. Aynı çözümü vs2013 ile kullanmak işe yarıyor, vs2015'te hiçbir şey elde edemiyoruz. bu aynı zamanda diğer üçüncü taraf kayıtları ve istisnaları ile ilgili bir sorundur (nservicebus gibi). Bunun sadece vs2013'te oluşturulan ve vs2015'te çalıştırılan proje için geçerli olup olmadığını merak ediyorum
Choco Smith

3
Bu yeni alet penceresi gerçekten berbat.
cedd

MS Classifications of Exceptions'a göre , işlenmemiş istisnalarınız varsa, her zaman hata ayıklayıcıyı bozar. "Seçenekler -> Hata Ayıklama -> Genel" listesindeki "Özel durumlar AppDomain'i geçtiğinde kes ..." seçeneğini işaretlemeniz gerekebilir.
tsul

Yanıtlar:


118

Hata ayıklamaya başladığınızda varsayılan olarak sağ alt bölmede görünen "İstisna Ayarları" adlı yeni bir pencere vardır. Beklediğiniz tüm seçeneklere sahiptir.

CTRL+ ALT+ İle açabilirsinizE

Bu, hangi istisnaların hata ayıklayıcıda bir kesintiye neden olduğunu seçmenize olanak tanır.

Bununla birlikte önemli olan, bu istisnaların her zaman mı yoksa yalnızca işlenmemiş bir istisna olduğunda mı kırılacağını da ayarlayabilmenizdir - ancak bunu ayarlamak çok sezgisel değildir.

Önce Araçlar> Seçenekler> Hata Ayıklama altında "Yalnızca Kodum'u Etkinleştir" seçeneğini işaretlemeniz gerekir.

Bu daha sonra, yeni İstisna Ayarları penceresinde sütun başlığını sağ tıklamanıza (Atıldığında Kes) ve daha sonra her bir istisnayı "Kullanıcı kodunda işlenmediğinde devam et" olarak ayarlamanıza izin veren "Ek İşlemler" sütununu eklemenize olanak tanır.

Bu nedenle, bir istisnayı veya tüm bir grubu sağ tıklayın ve "Kullanıcı kodunda işlenmediğinde devam et" bayrağını devre dışı bırakın. Maalesef, "Ek İşlemler" sütunu boş görünecek ve bu, "Kullanıcı kodunda işlenmediğinde ara ver" ile aynıdır.

görüntü açıklamasını buraya girin

Daha fazlası burada:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx


7
Aslında bu pencerede yalnızca "atılanla ara" seçenekleri vardır. İstediğim bu değil. "İşlenmediğinde ara vermek" istiyorum.
Ted Lowery

17
ve problem bu. Kırılmaz. yukarıda söylediğim gibi, mevcut prosedür çağrısından çıkar (adım adım çıkar) ve çağrı prosedüründeki bir sonraki kod satırını çalıştırmaya başlar.
Ted Lowery

2
ve "Yalnızca Kodum" u etkinleştirdim.
Ted Lowery

19
@TomStudee Bende de aynı sorun var. İstediğim şey "İşlenmediğinde kır" ama elde ettiğim şey "Fırlatıldığında kır". Soru şudur: "İşlenmediğinde ara" nasıl elde edilir?
ogggre

1
@TomStudee İstisnaları yalnızca işlenmediğinde kırmak için ayarlamanıza izin veren anahtar ayarını kaçırdığınız için çok ihtiyaç duyulan bazı açıklamaları ekledim.
Jerad Rose

36

Ben de aynı sorunu yaşadım ve bunu yaparak çözmeyi başardım -

  1. İstisna Ayarları penceresini açmak için Ctrl+ Alt+ ' eya basın .
  2. Tick ortak dil çalışma zamanı İstisnaları . görüntü açıklamasını buraya girin

Bu kadar!

Windows'un x64 sürümünü kullandığım için bu gönderiye ilham verdim .


7
Bu, kullanıcı kodu tarafından ele alınanlar da dahil olmak üzere tüm istisnaları kırmasına neden olacaktır.
carlin.scott

1
@ carlin.scott, listeden işlenen istisnaların işaretini manuel olarak kaldırabileceğinizi düşünüyorum.
Justin XL

6
@JustinXL Sorun şu ki, bu, ele alınıp alınmadığına göre değil, istisna türüne göre bir listedir. Örneğin System.ArgumentException, işlendiği zamanlar ve yapılmadığı zamanlar vardır. Ben sadece ne zaman kırılma umurumda değil ele.
Jerad Rose

1
@JeradRose Bir istisna işlenmediğinde hata ayıklayıcı her zaman kesilir. Dediğim gibi, ele alınan istisnalarda ara vermek istemiyorsanız, Atıldığında Kes listesinden istisna türlerinin işaretini kaldırmanız yeterlidir .
Justin XL

Her şeyi kontrol ederken bile bir istisnayı
bozmuyor

10

Yalnızca istisna kodlarıyla ilgili olduğunda kırmak isteyen Google çalışanları için, Visual Studio 2015'te bir seçenek vardır: Seçenekler-> Hata Ayıklama-> Genel-> Yalnızca Benim Kodum. Kontrol edildiğinde, istisna kodunuzun dışında yönetildiğinde (atıldığında ve yakalandığında) kırılmamasına izin verir.


Bu beni, VS2015'in bir nedenle bazı kod girmeyi reddettiği başka bir durumdan kurtardı. Kod "benim" ama bir şey "Sadece benim kodum" bayrağını tetikledi. Sanırım 2 VS örneğini ve bağımsız bir web sunucusunu ve muhtemelen daha fazlasını çalıştırırken bir yerde bir hata var.
LosManos

9

Microsoft, yeni özel durumlar penceresindeki mantığı ince bir şekilde değiştirdi.

Bkz. Http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Anahtar kısım şu şekildedir:

Önemli notlar

  • Bu yeni pencere, eski kalıcı iletişim kutusunun tüm işlevselliğini içerir. Hata ayıklayıcının hiçbir yeteneği, yalnızca onlara erişme şeklinizi değiştirmedi
  • Bir istisna işlenmediğinde hata ayıklayıcı her zaman kesilir
  • Kullanıcı tarafından işlenmeyen istisnalarda hata ayıklayıcı bozulursa değiştirilecek ayar bir bağlam menüsünün altına taşındı
  • Menü konumu Hata Ayıklama -> Windows -> İstisna Ayarları'na taşındı

Bununla birlikte , benim gibi , kodunuzda bir Global İşlenmemiş İstisna İşleyiciniz varsa , o zaman bu listedeki ikinci öğe anahtardır: Benim için, hiçbir istisna gerçekten işlenmemiş olmayacaktır, bu da VS2013'ten farklı görünmektedir.

VS'nin işlenmemiş istisnalarda bozulduğu davranışı geri almak için, kırmak istediğim tüm istisna türlerini işaretlemem ve ardından ikinci olarak "Ek Seçenekler" in (bu sütunu görünür yapmanız gerekebilir *) "Devam kullanıcı kodu işlenmeyen zaman" oldu dEĞİL ayarlayın. VS2015 mantığı , Genel İşlenmemiş İstisna İşleyicimin "kullanıcı kodunda işlendiğini" düşünmüyor , bu yüzden bunları bozuyor ; yine de yakalanan istisnaları bozmaz. Bu, VS2013'ün yaptığı gibi çalışmasını sağlar.

* "Ek İşlemler" sütunu nasıl etkinleştirilir? * "Ek İşlemler" sütunu nasıl etkinleştirilir?


2
Bu tam olarak VS2013 gibi çalışmaz, çünkü önerdiğiniz ayarlarla kullanıcı tarafından ele alınan istisnaları bozacaktır, ki bu geçmişte böyle değildi.
carlin.scott

"Ek Seçenekler" sütununu nasıl görünür hale getirirsiniz?
UuDdLrLrSs

@DaveInCaz Sütun başlığına sağ tıklayın> "Sütunları Göster"> "Ek İşlemler"
oatsoda

7

Buradaki satırların arasını doğru bir şekilde okursam, sorun, varsayılan hata ayıklayıcı davranışının işlenmemiş istisnalarda bozulmasına rağmen istisnanızın etkin bir şekilde 'kaybolmasıdır'.

Zaman uyumsuz yöntemleriniz varsa, bu sorunla karşılaşıyor olabilirsiniz çünkü bir Görev devamının bir parçası olarak bir iş parçacığı havuzu iş parçacığında yakalanmayan istisnalar, işlenmemiş istisnalar olarak kabul edilmez. Bunun yerine yutulurlar ve Görev ile birlikte saklanırlar.

Örneğin, şu koda bir göz atın:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}

Bu programı varsayılan hata ayıklayıcı ayarlarıyla çalıştırırsanız (yalnızca işlenmeyen istisnalarda durdurun), hata ayıklayıcı çalışmaz. Bunun nedeni, devam için ayrılan iş parçacığı havuzu iş parçacığının istisnayı yutması (Task örneğine geçirmesi) ve kendisini havuza geri bırakmasıdır.

Unutmayın, bu durumda, asıl sorun, Taskiade edilenin Test()asla kontrol edilmemesidir. Kodunuzda benzer türde 'ateşle ve unut' mantığı varsa, istisnaları atıldıkları anda görmezsiniz (yöntemin içinde 'işlenmemiş' olsalar bile); istisna, yalnızca Görevi bekleyerek, Sonucunu kontrol ederek veya İstisnasına açıkça bakarak gözlemlediğinizde görünür.

Bu sadece bir tahmin, ama bence muhtemelen böyle bir şey gözlemliyorsunuz.


Her ne kadar bu operasyonun sorunu ile ilgili olmasa da, asenkron rutinlerde ortaya çıkan istisnalar hakkında çok iyi bir noktayı gündeme getiriyor.
Phil Cooper

İstisna böyle saklansa bile hata ayıklayıcıyı durdurmanın bir yolu var mı?
Lucas

@Lucas, Farkında değilim, ancak bazı kod değişiklikleri ile yakınlaşabilirsiniz. Ateş et ve unut yöntem gövdenizde bir dene-yakala bloğu varsa, açık bir Debugger.Break()çağrı ekleyebilirsiniz . Alternatif olarak, açık bir ekleyebilir Debugger.Break()içinde TaskScheduler.UnobservedTaskExceptionburada olumsuz Görev temizlediğini aldığında o sonlandırıcıyı iş parçacığı üzerinde olduğu gibi bu, orijinal istisna daha sonra kovabilir olsa, işleyici. Genel olarak, Görev sonuçlarını her zaman gözlemlemeye çalışmalısınız veya en azından başarısızlık anında günlüğe kaydetmek için bir dene-yakala bloğuna sahip olmalısınız.
Dan Bryant

3

Deneyimlerime göre, herhangi bir değişiklik yaparsanız 2015'teki istisna ayarları tamamen geçersiz hale geliyor.

"CLR" ana grubuna kadar, işlenmeyenler için herhangi bir kırma işlemi almamalısınız. Bir istisna ele alınmazsa her zaman kırılırsınız. Ancak, CLR grubunu işaretlemediyseniz, bir try ... catch içindeki kod, bir kesintiye neden olmamalıdır. Durum bu DEĞİL.

Çözüm: Yeni istisna ayarları araç kutusunda, sağ tıklayın ve "varsayılanı geri yükle" yi seçin. Taadaaaa ... Yine normal davranır. Şimdi onunla uğraşma.


1

Talimatları izlemeyi deneyin:

  1. İstisna Ayarları penceresinde, pencereye sağ tıklayarak ve ardından Sütunları Göster'i seçerek bağlam menüsünü açın. (Yalnızca My Code'u kapattıysanız, bu komutu görmezsiniz.)
  2. Ek Eylemler adlı ikinci bir sütun görmelisiniz. Bu sütun, belirli istisnalarda kullanıcı kodu tarafından işlenmediğinde Devam'ı görüntüler, yani bu istisna kullanıcı kodunda işlenmemiş ancak harici kodda işlenmişse hata ayıklayıcının bozulmayacağı anlamına gelir.
  3. Bu ayarı, belirli bir istisna için (istisnayı seçin, sağ tıklayın ve Kullanıcı Kodunda İşlenmediğinde Devam Et'i seçin / seçimi kaldırın) veya tüm istisna kategorileri için (örneğin, tüm Ortak Dil Çalışma Zamanı istisnaları) değiştirebilirsiniz.

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx


Kesinlikle katılıyorum. Bu sütunu varsayılan olarak göstermemek çok kötü. Bulmak için çok zaman harcadım. Ayrıca, " işlenmemiş kullanıcı istisnası " nın ne anlama geldiği oldukça belirsizdir. İşleyicim bir Görev iptali (benzeri bir şey try { task.Wait(); } catch { ... }) vardı ve görevdeki OperationCanceledException bir şekilde kullanıcı kodunda işlenmemiş olarak kabul edildi.
tsul

1

Hepsi biraz kafa karıştırıcı ve bence eski istisnalar diyaloğu kadar iyi değil ama yine de.

Listede bir istisna varsa ve işaretliyse, istisna atıldığında hata ayıklayıcı bozulur.

Bir istisna işaretlenmemişse veya listede yoksa, hata ayıklayıcı yalnızca bu istisna türü kullanıcı işlenmediğinde kırılır.

Örneğin, aşağıdaki ekran görüntüsünde, hata ayıklayıcı, bir System.AccessViolationExceptionatıldığında her defasında kırılır , ancak diğer tüm istisnalar için, yalnızca istisna kullanıcı işlenmemişse kırılır.

Visual Studio 2015 istisnalar aracı penceresi


1

VS2015'e yükselttiğimde, istisnaların daha önce uygulamayı "bozduğu", ancak artık göz ardı edildiği ve hemen geçtiği sorunlar da yaşadım. Kodumuzun devam etmek yerine durmasını istediğimiz yerlerde kasıtlı olarak istisnalar atmasını istediğimiz zamanlar vardır . Throw New Exception("Message")Kodumuzu kasıtlı olarak kırmak için her zaman şu ifadeyi kullanırız:

    If SomethingReallyBad = True Then
        Throw New Exception("Something Really Bad happened and we cannot continue.")
    End If

VS2015 ile, klasik "System.Exception" dediğimizde ortaya çıkan şeydir Throw New Exception. Bu nedenle, yeni İstisna Ayarları'nda "System.Exception" işaretini kontrol etmemiz gerekiyordu:

System.Exception Kutusunu Kontrol Edin

Bir kez kontrol edildiğinde, kodumuz beklendiği gibi yaptı.


1

Bunun çözümü, anlamsal olarak ayarladığınızı düşündüğünüz şeyin tam tersidir. Bunu sağlamak için gereken kullanıcı kodu işlenmeyen tamamlandığında Devam edilir etkin değil yani işaretlenmemiş altında gösterildiği gibi ek Eylemler sütun istisna ayarları sekmesi - aşağıya bakınız:

Kodda işlenmediğinde etkili bir şekilde devam etme (yani kırma) diyorsun

İstisna Ayarları penceresi (Control + Alt + E)

Bunu yapmak için:

  1. Önem verdiğiniz istisnayı veya istisnalar kümesini sağ tıklayın (yani genellikle ağaçtaki en üst satırdaki 'Ortak Dil Çalışma Zamanı İstisnaları')
  2. Kullanıcı Kodunda İşlenmediğinde Devam Et seçeneğini seçin (aşağıya bakın)
  3. İstisnaların kontrol edilmediğinden emin olun (aşağıya bakın)
  4. hata ayıklamaya devam et

görüntü açıklamasını buraya girin

Bu benim için yaptı - tekrar mutlu oldum.

Bu VS 2015'teydi


0

Visual Studio'da, yeniden başlatma gerektiren takılıp kalmasına neden olabilecek bazı hata kesinlikle vardır. VS2015 bile.

A'nın NullReferenceException, yükseltildiğinde kırılmasını istememe rağmen (hala benim kodumda) bir 'dış' işleyici tarafından yakalandığı tek iş parçacıklı bir durum yaşadım.

Bunun "ele alınmış" bir istisna olduğunu ve "işlenmemiş" bir istisna olduğunu anlıyorum - ancak IISRESET yapmazsa, bazen VS'nin hızlı bir şekilde yeniden başlatılmasının bunu düzelteceğinden oldukça eminim.


0

Visual Studio 2017, hata işleme konusunda gayet iyi çalışıyor. Öte yandan Visual Studio 2015, hata ayıklama modunda zaman uyumsuz bir görevde meydana gelen tüm istisnalar yakalandığından, ancak daha sonra üzerine adım atarsam sonsuza kadar askıda kaldığından, görevlerde hata işlemede berbattır. Hata ayıklama olmadan çalıştırılırsa, hiçbir istisna yakalanmadan süresiz olarak askıda kalır !!! Görsel stüdyosunu seviyorum ve 1995'ten beri kullanıyorum ve 2015'ten beri kullanıyorum ve 2015'ten bu yana en kötü versiyonu, 2010'dan 2015'e doğrudan atladım. 8 saatimi bu istisnai işlemeyi başarı olmadan çalıştırmaya çalışmak için harcadım. Tam kodu ev bilgisayarımda 2017'ye kopyaladım ve mükemmel çalıştı. Microsoft'un görevleri 2015 derleyicisinin doğru şekilde işleyemeyeceği bir çerçeveye itmesinden çok rahatsız oldum.

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.