2010-12-30 20 views
11

C++ programımdaki hataları işlemek istiyorum, bu nedenle bu hataları yönetmek için bazı özel durum sınıfları oluşturdum, ancak programımda hangi satırın hata oluştuğunu belirtmek istiyorum.C++ programında hata satırı numarası nasıl alınır

Özel durum sınıfımın yapıcısına LINE makroyu geçtim.

Örneğin

: Sadece SATIR B numarasını alabilirsiniz Bu örnekte

void f(int i){ // LINE A 
    if(i<0) 
    throw(OutOfRange("message", __LINE__); // LINE B 
} 

void main(){ 

    try{ 
    f(-6); // LINE C 
    } 
    catch(const OutOfRange& error){ 
    //do something 
    } 

} 

ama LINE A ve HAT C numaralarını almak istiyorum.

Herhangi bir fikir, nerede ve nasıl kullanılır LINE macro ??

Teşekkürler.

+1

Bir stacktrace/traceback istiyorsunuz. – delnan

+0

http://www.decompile.com/cpp/faq/file_and_line_error_string.htm – anno

cevap

8

yığın izi ve Yeniden elde etmek için portatif bir yol yok. biraz benzer bir şey ile elde edilebilir:

struct SourcePoint 
{ 
    const char *filename; 
    int line; 
    SourcePoint(const char *filename, int line) 
     : filename(filename), line(line) 
    { } 
}; 

std::vector<SourcePoint> callstack; 

struct SourcePointMarker 
{ 
    SourcePointMarker(const char *filename, int line) 
    { 
     callstack.push_back(SourcePoint(filename, line); 
    } 

    ~SourcePointMarker() 
    { 
     callstack.pop_back(); 
    } 
} 

#define MARK_FUNCTION \ 
    SourcePointMarker sourcepointmarker(__FILE__, __LINE__); 

Sonra sağ bu yaklaşımı içinde kullanma örnek

int myFunction(int x) 
{ 
    MARK_FUNCTION 
    ... 
} 

için her bir işlev (veya ilgi alanı merkezi) sadece bir satır ekleyin başında ... sonra hata işleyicileriniz kim tarafından kim tarafından çağrıldığını bilebileceğinizi (tabii ki sadece MARK_FUNCTION ile donatılmış olan işlevleri veya yerleri bileceksiniz). Bu sadece test sırasında (ve üretimde değil) gerekliyse, muhtemelen çekirdek dökümlerini etkinleştirmeniz ve otopsi analizinde hata ayıklayıcısını nasıl çalıştırmanız gerektiğini öğrenmeniz gerekir.

+1

evet aradığım şey bu, doğru deneyeceğim şimdi, çok teşekkürler. – CHAKRI

1

C Hattı, f için __LINE__ ikinci argüman ileterek hariç ... (Ben bir yol düşünemiyorum yakın imkansız olurdu

Hattı şöyle:.

void f(int i){ const int lineA = __LINE__; 
    if(i<0) 
    throw(OutOfRange("message", __LINE__); // LINE B 
} 
+0

void f (int i) {const int satırA = __LINE__; (i <0) atıyorsa (OutOfRange ("message", lineA); // LINE B } – CHAKRI

+0

cevabınız için teşekkürler, ama "LINE C" nin imkansız olduğunu düşünüyorum çünkü çoğu derleyicinin kullanması imkansız! – CHAKRI

+1

@CHAKRI: Derleyici, C++ – Puppy

1

You Bir yığın izleme ve bir hata ayıklayıcısına gereksinim var Standart C++ 'da, C satırını bir argüman olarak (f(-6, __LINE__)) geçmeden bulabileceğiniz hiçbir yol yoktur ve Line A'yı bulamadığınız hiçbir şekilde yoktur.

+0

+1, fakat "yığın yığını * veya * bir hata ayıklayıcısı" derim Bir yığın takibi harici bir hata ayıklayıcısı olmadan bile elde edilebilir (bkz. 'backtrace' işlevi) –

+0

tamam belki argüman olarak atayacağım.Teşekkür ederim – CHAKRI

1

CPPUNit çerçevesi, işlevler yerine makroları kullanır. Böylelikle satır numarasını makronun bulunduğu yerde bulabiliyorsunuz.

Genel anlamda geçerli bir yaklaşım olduğunu düşünmüyorum, ancak CPPUnit geliştiricilerinin yaptığı yönteme göz atmayı ilginç bulabilirsin.

+0

+1. Assert() makrosunun uygulanmasına bakın; Ben bir iddianın başarısızlığı üzerine std :: abort() yerine std :: logic_error istisnası atar benzer bir assertion() makro oluşturduk. – Raedwald

+0

tamam şuna bakacağım, teşekkürler – CHAKRI

İlgili konular