मैं उस पंक्ति संख्या को कैसे प्राप्त कर सकता हूं जो अपवाद को फेंकती है?


198

एक catchब्लॉक में, मैं उस लाइन नंबर को कैसे प्राप्त कर सकता हूं जिसने एक अपवाद को फेंक दिया?


रनटाइम पर कोई स्रोत कोड नहीं है। इस पंक्ति संख्या का क्या उपयोग किया जाएगा? डिबग समय में, IDE स्पष्ट रूप से रेखा दिखाता है जो अपवाद को फेंकता है।
ankitjaininfo



@ankitjaininfo नहीं अगर कोई आईडीई है मददगार!
माइकल

क्या इससे आपके सवाल का जवाब मिलता है? अपवाद हैंडलिंग में लाइन नंबर दिखाएं
Liam

जवाबों:


280

यदि आपको Exception.StackTrace से मिलने वाले फ़ॉर्मेट किए गए स्टैक ट्रेस से अधिक के लिए लाइन नंबर की आवश्यकता है, तो आप StackTrace क्लास का उपयोग कर सकते हैं :

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get stack trace for the exception with source file information
    var st = new StackTrace(ex, true);
    // Get the top stack frame
    var frame = st.GetFrame(0);
    // Get the line number from the stack frame
    var line = frame.GetFileLineNumber();
}

ध्यान दें कि यह केवल तभी काम करेगा जब विधानसभा के लिए पीडीबी फ़ाइल उपलब्ध हो।


2
(नई StackTrace (पूर्व, सच))। GetFrame (0) .GetFileLineNumber () तत्काल विंडो से VB सिंगल लाइन के लिए।
जोनाथन

34
सी # एक लाइनर:int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
गनविन

17
यह हमेशा मेरे लिए 0 देता है। यह एक pdb फ़ाइल नहीं होने के कारण होता है? यह क्या है और इसे कैसे प्राप्त करें? (मैं ASP.net का उपयोग कर रहा हूँ)
Brabbeldas

17
आप GetFrame (0) का उपयोग क्यों कर रहे हैं? मुझे लगता है कि आपको GetFrame (FrameCount-1) का उपयोग करना चाहिए।
देवलद स्वान्पेल

9
मैंने पाया है @DewaldSwanepoel का उपयोग GetFrame(st.FrameCount-1)करने का सुझाव कहीं अधिक विश्वसनीय है।
ब्रैड मार्टिन

75

सरल तरीका, Exception.ToString()फ़ंक्शन का उपयोग करें , यह अपवाद विवरण के बाद लाइन को वापस कर देगा।

आप प्रोग्राम डिबग डेटाबेस को भी देख सकते हैं क्योंकि इसमें संपूर्ण एप्लिकेशन के बारे में डीबग जानकारी / लॉग शामिल हैं।


वैसे MSDN अलग तरीके से सोचता है, कि यह "वर्तमान अपवाद का एक स्ट्रिंग प्रतिनिधित्व बनाता है और लौटाता है": msdn.microsoft.com/en-us/library/…
Prokurors

आपको कुछ ऐसा मिलता है:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
को प्रोग्रामिंग के प्रोफेसर

3
यह स्वीकृत उत्तर होना चाहिए। मैं हमेशा ex.message के लिए गया था और सोचता था कि बेवकूफ VB.net जावा में समान जानकारी प्राप्त करने में सक्षम क्यों नहीं है।
मथिस कोहली

3
यह पागलपन है कि इस उत्तर में अधिक उत्थान नहीं है। यह सरल है, मज़बूती से काम करता है, और पीडीबी कैविटीज़ के साथ नहीं आता है।
निक पेंटर

9
Exception.Messageमेरे लिए मर चुका है। फिर कभी नहीं।
मोनिका सेलियो

27

यदि आपके पास .PBOफाइल नहीं है :

सी#

public int GetLineNumber(Exception ex)
{
    var lineNumber = 0;
    const string lineSearch = ":line ";
    var index = ex.StackTrace.LastIndexOf(lineSearch);
    if (index != -1)
    {
        var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
        if (int.TryParse(lineNumberText, out lineNumber))
        {
        }
    }
    return lineNumber;
}

Vb.net

Public Function GetLineNumber(ByVal ex As Exception)
    Dim lineNumber As Int32 = 0
    Const lineSearch As String = ":line "
    Dim index = ex.StackTrace.LastIndexOf(lineSearch)
    If index <> -1 Then
        Dim lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length)
        If Int32.TryParse(lineNumberText, lineNumber) Then
        End If
    End If
    Return lineNumber
End Function

या अपवाद वर्ग पर एक सीमा के रूप में

public static class MyExtensions
{
    public static int LineNumber(this Exception ex)
    {
        var lineNumber = 0;
        const string lineSearch = ":line ";
        var index = ex.StackTrace.LastIndexOf(lineSearch);
        if (index != -1)
        {
            var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
            if (int.TryParse(lineNumberText, out lineNumber))
            {
            }
        }
        return lineNumber;
    }
}   

8
दुर्भाग्य से अंग्रेजी ओएस में काम नहीं करेगा ("लाइन" शब्द स्थानीय पर निर्भर करता है)।
इवान कोचूरिन

2
@KvanTTT आप इस्तेमाल कर सकते हैं Regex.Matchसाथ :[^ ]+ (\d+)ही प्रभाव के लिए।
दान बेचर

यह उत्तर मेरे लिए काम नहीं करता है, क्योंकि ex.StackTrace में कोई नहीं है :line और मेरे पास PDB फ़ाइल नहीं है।
वारिम चिम्पांजी

18

आप .PDBअसेंबली से संबंधित प्रतीक फ़ाइलों को शामिल कर सकते हैं जिनमें मेटाडेटा जानकारी होती है और जब एक अपवाद फेंका जाता है तो इसमें स्टैकट्रेस में पूरी जानकारी शामिल होगी जहां यह अपवाद उत्पन्न हुआ था। इसमें स्टैक में प्रत्येक विधि के लाइन नंबर होंगे।


पीडीबी सहित कोई कैसे जाएगा? क्या आवेदन में PDB को बंडल करने / GAC में पंजीकृत करने का कोई तरीका है?
याकूब फारसी


6

इसे जाँचें

StackTrace st = new StackTrace(ex, true);
//Get the first stack frame
StackFrame frame = st.GetFrame(0);

//Get the file name
string fileName = frame.GetFileName();

//Get the method name
string methodName = frame.GetMethod().Name;

//Get the line number from the stack frame
int line = frame.GetFileLineNumber();

//Get the column number
int col = frame.GetFileColumnNumber();

1

उत्तर के लिए अद्यतन

    // Get stack trace for the exception with source file information
    var st = new StackTrace(ex, true);
    // Get the top stack frame
    var frame = st.GetFrame(st.FrameCount-1);
    // Get the line number from the stack frame
    var line = frame.GetFileLineNumber();

1

मैंने @ davy-c द्वारा समाधान का उपयोग करने की कोशिश की, लेकिन एक अपवाद था "System.FormatException: 'इनपुट स्ट्रिंग एक सही प्रारूप में नहीं था।" ", यह तब भी था क्योंकि अभी भी लाइन नंबर के पीछे पाठ था, मैंने कोड को संशोधित किया। पोस्ट किया गया और इसके साथ आया:

int line = Convert.ToInt32(objErr.ToString().Substring(objErr.ToString().IndexOf("line")).Substring(0, objErr.ToString().Substring(objErr.ToString().IndexOf("line")).ToString().IndexOf("\r\n")).Replace("line ", ""));

यह मेरे लिए VS2017 C # में काम करता है।


0

विस्तार विधि

static class ExceptionHelpers
{
    public static int LineNumber(this Exception ex)
    {
        int n;
        int i = ex.StackTrace.LastIndexOf(" ");
        if (i > -1)
        {
            string s = ex.StackTrace.Substring(i + 1);
            if (int.TryParse(s, out n))
                return n;
        }
        return -1;
    }
}

प्रयोग

try
{
    throw new Exception("A new error happened");
}
catch (Exception ex)
{
    //If error in exception LineNumber() will be -1
    System.Diagnostics.Debug.WriteLine("[" + ex.LineNumber() + "] " + ex.Message);
}

0

मेरे लिए काम करना:

var st = new StackTrace(e, true);

// Get the bottom stack frame
var frame = st.GetFrame(st.FrameCount - 1);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
var method = frame.GetMethod().ReflectedType.FullName;
var path = frame.GetFileName();

0

मैंने एक्सेप्शन में एक एक्सटेंशन जोड़ा, जो लाइन, कॉलम, विधि, फ़ाइल नाम और संदेश देता है:

public static class Extensions
{
    public static string ExceptionInfo(this Exception exception)
    {

        StackFrame stackFrame = (new StackTrace(exception, true)).GetFrame(0);
        return string.Format("At line {0} column {1} in {2}: {3} {4}{3}{5}  ",
           stackFrame.GetFileLineNumber(), stackFrame.GetFileColumnNumber(),
           stackFrame.GetMethod(), Environment.NewLine, stackFrame.GetFileName(),
           exception.Message);

    }
}

-3

Global.resx फ़ाइल में Application_Error नामक एक घटना है

जब भी कोई त्रुटि होती है तो यह आग लग जाती है।, आप आसानी से त्रुटि के बारे में कोई भी जानकारी प्राप्त कर सकते हैं, और इसे बग ट्रैकिंग ई-मेल पर भेज सकते हैं।

इसके अलावा, मुझे लगता है कि सभी यू करने की जरूरत है। Global.resx संकलित करें और अपने dll के (2 dll) को अपने बिन फ़ोल्डर में जोड़ें और यह काम करेगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.