Java yığın izleme dökümünün görüntülenen satır sayısını nasıl artırabilirim?


Yanıtlar:


122

Yapmanıza gerek yok; bu bilgi yığın izlemede başka bir yerde bulunur. Belgelerden printStackTrace():

Karakterleri içeren satırların varlığına dikkat edin "...". Bu satırlar, bu istisna için yığın izlemenin geri kalanının, bu istisnanın neden olduğu istisnanın yığın izlemesinin altından belirtilen çerçeve sayısıyla eşleştiğini gösterir ("çevreleyen" istisna).

Bu kısaltma, "nedensel istisna" nın yakalanmasıyla aynı yöntemden sarılmış bir istisnanın atıldığı yaygın durumda çıktının uzunluğunu büyük ölçüde azaltabilir.

Başka bir deyişle, "... x more"yalnızca zincirlenmiş bir istisnada ve yalnızca xyığın izlemenin son satırları başka bir zincirleme istisnanın yığın izlemesinin parçası olarak zaten mevcut olduğunda görünür .

Bir yöntemin Foo istisnasını yakaladığını, onu istisna Barına sardığını ve Bar attığını varsayalım. Daha sonra Foo'nun yığın izi kısaltılacaktır. Herhangi bir nedenle tam izlemeyi istiyorsanız, yapmanız gereken tek şey ...Foo'nun yığın izlemesinden önceki son satırı almak ve bunu Bar'ın yığın izlemesinde aramaktır; bu çizginin altındaki her şey, Foo'nun yığın izlemesinde tam olarak yazdırılan şeydir.


Son paragraf yanıltıcıdır. Herhangi bir örtüşme olmayacak, önceki çizgi ...farklı olan ilk karedir. Ancak en azından onu bulmaya yardımcı olan aynı sınıfta olacak.
Marcono1234

5

Sizin için bir yöntem hakkında hızlı tahmin.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

3

Yığın izini Throwable.printStackTrace () belgelerinden alalım :

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

Nedenler, en alttaki en iç içe olandan ("temel neden"), yazdırılan yığın izlemenin ait olduğu nedene kadar görüntülenir.

Bu durumda temel neden, neden olan LowLevelException, neden MidLevelExceptionolanıdır HighLevelException.

Tam yığın izlemesini elde etmek için, çevreleyen istisnanın çerçevelerine (ve çevreleyen istisnalara) bakmanız gerekir:

  1. Kaç karenin çıkarıldığına bakın: "... X tane daha"
  2. Çevreleyen istisnada atlanan çerçeveleri arayın
    1. Kaç karenin çıkarıldığına bakın: "... Y daha fazla"
    2. İlk X - Y karelerini yığın izlemesine ekleyin
  3. Y> 0 ise, atlanan kare sayısı olarak 2. adımı tekrarlayın

Yani tam yığın izini elde etmek isteseydik LowLevelException, aşağıdakileri yapardık:

  1. Kaç karenin çıkarıldığına bakın: "... 3 tane daha"
  2. Çevreleyen istisnada ( MidLevelException) ihmal edilen çerçeveleri arayın
    1. 1 çerçeve çıkarıldı ("... 1 tane daha")
    2. İlk 2 (3-1) kareyi yığın izlemesine ekleyin
  3. İhmal edilen kare sayısı olarak 2. adımı 1 ile tekrarlayın
    1. Ekteki istisnaya bakın MidLevelException( HighLevelException)
    2. İlk 1 kareyi yığın izlemesine ekle

Tam yığın izlemeniz şu şekilde görünür:

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

Yan notlar:

  • Hiçbir çerçevenin listelenmediği durumlar olabilir, örneğin:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more
    

    Neden aynı çizgide yarattığı durumlarda gerçekleşebilir: new HighLevelException(new MidLevelException()). Kafanızı karıştırmayın, yukarıda açıklanan yaklaşım hala işe yarıyor, istisnadan kullanılacak hiçbir çerçeve yok, ekiyle devam edin.

  • Bazı durumlarda, ihmal edilmeyen ilk kareye (yukarıdaki satır ... X more) bakarak sayımdan tasarruf edebilirsiniz . Bu satırdaki yöntemi hangi yöntemlerin çağırdığını biliyorsanız, çevreleyen istisnanın çerçevelerinde doğrudan arayanları arayabilirsiniz:

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
    
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.