asp.net-coreexceptiontry-catchexmethod-names

How to get the method name and line number in Exception in ASP Core 5


I want to get the method name and line number when an error occur, I am using Core 5.

        try
        {
           //My code
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Method Name / Line Number");
        }

Update:

I found a Solution like this:

_logger.LogError(ex, "\n=> ex Error: " + ex + "\n=> Action Name: " + ex.TargetSite.ReflectedType.Name + "\n=> Error Message: " + ex.Message + "\n=> Line Number: " + ex.LineNumber());

Solution

  • A simple call to ToString() on exception will give you the complete information needed. For example when we run the following code:

    public static void Main()
    {
        try
        {
            //my code
            throw new ArgumentException();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
    

    The output would be somewhat like:

    System.ArgumentException: Value does not fall within the expected range.
       at ConsoleApp.Program.Main() in C:\Users\USER\source\Playground\ConsoleApp1\Program.cs:line 20
    

    where Main() is the method name and 20 is the line number.

    To get the format as required in question we can write a wrapper around the exception and fetch the line number from it:

    using System;
    using System.Reflection;
    
    namespace ConsoleApp
    {
        class Program
        {
            public static void Main()
            {
                try
                {
                    //my code
                    throw new ArgumentException();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(MethodBase.GetCurrentMethod().Name + "/" + GetLineNumber(ex));
                }
            }
    
            public static 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;
            }
        }
    }
    

    Note: In the extract line method, we are fetching the top most exception. This comes in handy when we have a chain of exceptions in our stack trace.