2014-06-19 19 views
5

yılında stacktrace kısmını kaybederler. İlk durumda, ayıklayıcı işlenmeyen özel durum yakalar:İstisnalar İki örnekler var deneme/yakalama bağlamında

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    throw new Exception(); 
} 

Ve istisna tam stacktrace vardır:

at ConsoleApplication28.Program.Exec() 
    at ConsoleApplication28.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

ikinci vaka:

static void Main(string[] args) { 
    Exec(); 
} 
static void Exec() { 
    try { 
     throw new Exception(); 
    } 
    catch (Exception ex) { 
    } // Breakpoint 
} 

kesme anda istisna kısa sahiptir StackTrace:

at ConsoleApplication28.Program.Exec() 

İkinci durumda içerme yöntemine yığınlar neden kesilir ve nasıl önlenir? Hata raporları için tam stacktrace'e ihtiyacım var, aksi halde problemi bulmak için bazen tam stacktrace olmadan mümkün değildir.

+0

"Ben aksi takdirde sorun tam stacktrace olmadan, orada bulmak bazen mümkün değildir, bugreports tam stacktrace ihtiyacımız var." Sorunuzun bu kısmına cevap vermek için, Main() yönteminizde istisnaların olabileceği, belki de en üstte, "yukarıda" bulunan bir yakalama yapısını eklemeniz gerekir. Yakalama maddesinde exceptionObject.ToString() öğesini bir dosyaya veya daha sonra analiz için bir şeyler yazmalısınız. – RenniePet

cevap

3

Visual Studio hata ayıklayıcısında gördüğünüz şey, Visual Studio Barındırma İşlemi'nin yakalanmasının işlenmemiş özel durumudur (yani, ilk iki yığın karesinden sonraki her şey, VS "ana bilgisayar tesisatının" bir parçasıdır). Eğer barındırma işlemini devre dışı bırakırsanız çünkü ikinci durumda Main için yığın çerçevesini görmeyeceğini rağmen, siz (her iki senaryoda da bir "kısa" yığın izini göreceksiniz (Proje Özellikler-> Visual Studio barındıran işlem etkinleştirme) istisna "işlenir", Main'a kadar yayılmasına izin verilmez). Bu daha kısa yığın izlemesi, uygulamayı hata ayıklayıcısının dışında çalıştırıyorsanız göreceğiniz yığın izlemesidir. tahmin edilebileceği gibi

yığın işleri - Her bir yöntem çağrısı bunun üzerine başka bir yığın çerçeve iter, ve yığın çerçevesi yöntemin sonunda "attı" ya da istiften alınır. İstisnada gördüğünüz yığın izi, istisnanın atıldığı kareden oluşan yığın çerçevelerinden oluşur, istisnanın en sonunda işlendiği çerçeveye geri döner, çünkü yığın "çözülmez".

+0

Sen daha net barındırma süreci nedeniyle ve catch bloğu nedeniyle hangi yığın izleme parçası belirtmek için bu cevabı yeniden düzenlemek isteyebilirsiniz. Daha sonra, yığın izlerinin istisna olarak yığın yığınları yığınları olarak birleştirildiğini vurgulayabilirsiniz, bu nedenle "Ana" bölümü henüz orada değil. –

+0

Ama neden Main() ikinci stacktrace içinde değil? Anlamadım. System.Diagnostics.StackTrace ve Main() ile istisna noktasında stacktrace'i kontrol ettim. –

+2

İstisna yığını izi, istisnanın yakalandığı noktaya kadar yığın izidir. Bu yığın izlemesi, istisna olarak çağrı yığınının seviyesine kadar kabarır. Bu, "bugüne kadar yığın izinin ne olduğunu" gösterir, "çağrı, programın başına geri yığılır" şeklindedir. –