আমি কীভাবে লাইন নম্বর পেতে পারি যার ব্যতিক্রম ছুঁড়েছে?


198

একটি catchব্লকে, আমি কীভাবে লাইন নম্বর পেতে পারি যা একটি ব্যতিক্রম ছুঁড়েছিল?


রানটাইমের সময় কোনও উত্স কোড নেই। কোন এই লাইন ব্যবহার করা হবে? ডিবাগ সময়ে, আইডিই স্পষ্টভাবে লাইন দেখায় যা ব্যতিক্রম ছুঁড়ে।
ankitjaininfo



আইডিই না থাকলে @ কিত্তজাইনিনফো সহায়ক নয় !
মাইকেল

উত্তর:


280

আপনি যদি কেবলমাত্র ব্যতিক্রমী স্ট্যাকট্রেস থেকে পাওয়া ফর্ম্যাট স্ট্যাক ট্রেসের চেয়ে বেশি লাইন নম্বরটির প্রয়োজন হয় তবে আপনি স্ট্যাকট্রেস ক্লাসটি ব্যবহার করতে পারেন :

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
? (নতুন স্ট্যাকট্রেস (প্রাক্তন, সত্য)) গেটফ্রেম (0)। তাত্ক্ষণিক উইন্ডো থেকে ভিবি একক লাইনের জন্য গেটফাইললাইন নম্বর ()।
জোনাথন

34
সি # ওয়ান লাইনার:int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
গানউইন

17
এটি সর্বদা আমার জন্য 0 ফেরত দেয়। এটি কি পিডিবি ফাইল না থাকার কারণে ঘটে? এটি কী এবং এটি কীভাবে পাবেন? (আমি
এএসপি নেট

17
আপনি কেন গেফ্রেম (0) ব্যবহার করছেন? আমি মনে করি আপনার গেটফ্রেম (ফ্রেমকাউন্ট -১) ব্যবহার করা উচিত।
দেওয়াল্ড স্বানিপোল 15'15

9
আমি GetFrame(st.FrameCount-1)আরও অনেক নির্ভরযোগ্য হয়ে ওঠার জন্য দেওয়াল্ডসওয়ানোপেল পরামর্শটি পেয়েছি ।
ব্র্যাড মার্টিন

75

সহজ উপায়, Exception.ToString()ফাংশনটি ব্যবহার করুন , এটি ব্যতিক্রম বর্ণনার পরে লাইনটি ফিরিয়ে দেবে।

পুরো অ্যাপ্লিকেশন সম্পর্কে ডিবাগ তথ্য / লগ থাকাতে আপনি প্রোগ্রামটি ডিবাগ ডাটাবেসও পরীক্ষা করতে পারেন।


ওয়েল এমএসডিএন ভিন্নভাবে চিন্তা করে, এটি "বর্তমান ব্যতিক্রমের একটি স্ট্রিং উপস্থাপনা তৈরি করে এবং ফিরিয়ে দেয়": এমএসডিএন.মাইক্রোসফটকম
en

আপনি এর অনুরূপ কিছু পান: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 এর জন্য গিয়েছিলাম এবং ভাবছিলাম যে বোকা ভিবি নেট জাভা হিসাবে একই তথ্য পেতে সক্ষম হয় না।
ম্যাথিস কোহলি

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

বা ব্যতিক্রম ক্লাসে extentions হিসাবে

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+)একই প্রভাবের জন্য।
ড্যান বেচার্ড

এই উত্তরটি আমার পক্ষে কার্যকর হয় না, কারণ প্রাক্তন স্ট্যাকট্রেসের কোনও নেই :line এবং আমার কাছে পিডিবি ফাইল নেই।
যুদ্ধের মতো শিম্পাঞ্জি

18

আপনি .PDBসমাবেশের সাথে সম্পর্কিত প্রতীক ফাইলগুলি অন্তর্ভুক্ত করতে পারেন যার মধ্যে মেটাডেটা তথ্য রয়েছে এবং যখন কোনও ব্যতিক্রম নিক্ষেপ করা হবে তখন এতে এই ব্যতিক্রমটি যেখান থেকে উত্পন্ন হয়েছে তার স্ট্যাকট্র্যাসে সম্পূর্ণ তথ্য থাকবে। এতে স্ট্যাকের প্রতিটি পদ্ধতির লাইন নম্বর থাকবে।


একজন পিডিবি সহ কীভাবে চলবে? অ্যাপ্লিকেশনটিতে পিডিবি বান্ডিল করার / জিএকে রেজিস্ট্রেশন করার কোনও উপায় আছে কি?
জ্যাকব পার্সি


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

আমি @ ডেভি-সি দ্বারা সমাধানটি ব্যবহার করার চেষ্টা করেছি তবে একটি ব্যতিক্রম ছিল "সিস্টেম। ফরম্যাট এক্সপ্লেশন: 'ইনপুট স্ট্রিংটি সঠিক বিন্যাসে ছিল না।" ", লাইন নম্বরটি পেরিয়ে যাওয়ার পরেও এটি কোডটি সংশোধন করেছিল পোস্ট এবং সাথে এসেছেন:

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 ", ""));

এটি ভিএস2017 সি # তে আমার জন্য কাজ করে।


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

গ্লোবাল.রেক্স ফাইলটিতে অ্যাপ্লিকেশন_এরর নামে একটি ইভেন্ট রয়েছে

এটি যখনই ত্রুটি ঘটে তখন আগুন লাগে।

এছাড়াও আমি মনে করি আপনার সমস্ত করণীয় হ'ল গ্লোবাল.আরএক্সকে সংকলন করা এবং এটির ডিএল এর (2 ডিএলএস) আপনার বিন ফোল্ডারে যুক্ত করা এবং এটি কার্যকর হবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.