2010-12-30 13 views
11

मैं अपने सी ++ प्रोग्राम में त्रुटियों को संभालना चाहता हूं, इसलिए मैंने उन त्रुटियों को प्रबंधित करने के लिए कुछ अपवाद वर्ग बनाए, लेकिन मैं यह निर्दिष्ट करना चाहता हूं कि मेरे प्रोग्राम में कौन सी रेखा त्रुटि हुई।सी ++ प्रोग्राम में त्रुटि रेखा संख्या कैसे प्राप्त करें

मैंने लाइन मैक्रो को अपवाद वर्ग के निर्माता के पास पारित किया।

उदाहरण के लिए:

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 
    } 

} 

इस उदाहरण मैं केवल लाइन बी संख्या प्राप्त कर सकते में है, लेकिन मैं लाइन एक और लाइन सी संख्या प्राप्त करना चाहते हैं।

कोई विचार, कहां और कैसे उपयोग करें LINE मैक्रो ??

धन्यवाद।

+1

आप एक स्टैकट्रैक/ट्रेसबैक चाहते हैं। – delnan

+0

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

उत्तर

8

आप देख रहे हैं एक स्टैक ट्रेस और के लिए इसे प्राप्त करने के लिए कोई पोर्टेबल तरीका नहीं है। कुछ इसी तरह कुछ के साथ प्राप्त किया जा सकता है:

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__); 

फिर सही प्रत्येक कार्य (या रुचि का विषय) तुम सिर्फ एक पंक्ति जोड़ें की शुरुआत ... उदाहरण

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

के लिए में इस दृष्टिकोण का उपयोग करने के बाद आपके त्रुटि हैंडलर आप जानते हैं कि किसके द्वारा और किस पर बुलाया गया था (बेशक आप केवल उन कार्यों या स्थानों को जानेंगे जिन्हें मार्क_फंक्शन के साथ वाद्य किया गया है)। यदि यह केवल परीक्षण (और उत्पादन में नहीं) के दौरान आवश्यक है तो शायद आपको कोर डंप को सक्षम करना चाहिए और पोस्ट-मॉर्टम विश्लेषण में डीबगर चलाने का तरीका सीखना चाहिए।

+1

हाँ, जो मैं ढूंढ रहा हूं, मैं इसे सही कोशिश करूंगा अब, बहुत बहुत धन्यवाद। – CHAKRI

1

लाइन सी (मैं एक तरह से नहीं सोच सकते हैं के पास असंभव होगा f करने के लिए एक दूसरा तर्क गुजर, __LINE__ के अलावा ...

लाइन ए इस प्रकार है:।

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

आपका मतलब शून्य एफ (int i) {const int lineA = __LINE__; अगर (i <0) फेंक (आउटऑफेंज ("संदेश", लाइनए); // लाइन बी } – CHAKRI

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे लगता है कि "लाइन सी" असंभव नहीं है क्योंकि अधिकांश कंपाइलर इसका उपयोग करता है !! – CHAKRI

+1

@CHAKRI: कंपाइलर कई सी, कई चीजें कर सकता है जो आप मानक सी ++ में नहीं कर सकते हैं। – Puppy

1

आप एक स्टैक ट्रेस और डीबगर की आवश्यकता है। मानक सी ++ में कोई रास्ता नहीं है कि आप इसे तर्क सी (f(-6, __LINE__)) के रूप में पास किए बिना लाइन सी पा सकते हैं, और लाइन ए

+0

+1, लेकिन मैं "एक स्टैक ट्रेस * या * डीबगर" कहूंगा एक स्टैक ट्रेस को बाहरी डीबगर के बिना भी प्राप्त किया जा सकता है (उदाहरण के लिए 'बैकट्रैक' फ़ंक्शन)। –

+0

ठीक है शायद मैं इसे तर्क के रूप में पेश करूंगा। धन्यवाद – CHAKRI

1

CPPUNit ढांचे कार्यों के बजाय मैक्रोज का उपयोग करता है। इस तरह आप आसानी से उसी स्थान पर लाइन नंबर प्राप्त कर सकते हैं जहां मैक्रो कहा जाता है।

मुझे नहीं लगता कि यह सामान्य अर्थ में एक वैध दृष्टिकोण है, लेकिन आपको सीपीपीयूनीट डेवलपर्स के तरीके को देखने के लिए दिलचस्प लग सकता है।

+0

+1। जोर() मैक्रो के कार्यान्वयन को देखो; मैंने एक समान दावे() मैक्रो बनाया है, जो एक दावे की विफलता पर std :: abort() को कॉल करने के बजाय std :: logic_error अपवाद फेंकता है। – Raedwald

+0

ठीक है, मैं इसे देख लूंगा, धन्यवाद – CHAKRI

संबंधित मुद्दे