কিভাবে ব্যতিক্রম পূর্ণ স্ট্যাক ট্রেস মুদ্রণ?


99

উদাহরণস্বরূপ, এক জায়গায় ...

//---------------a
try
{
    // some network call
}
catch(WebException we)
{
    throw new MyCustomException("some message ....", we);
}

... এবং অন্য জায়গায় ...

//--------------b
try
{
    // invoke code above
}
catch(MyCustomException we)
{
    Debug.Writeline(we.stacktrace);   // <----------------
}

আমি যে স্ট্যাকট্রেসটি প্রিন্ট করি, এটি কেবল একটি থেকে শুরু করে বি পর্যন্ত শুরু হয়, এটিতে ওয়েবঅ্যাকসেপশন থেকে অভ্যন্তরীণ স্ট্যাকট্রেস অন্তর্ভুক্ত হয় না।

আমি কীভাবে সব স্ট্যাকট্রেস প্রিন্ট করতে পারি ???


4
মনে রাখবেন যে উত্সাহী ওয়েবএক্সেপশনটির স্ট্যাকট্রেস মুদ্রিত হবে না কারণ আপনি ওয়েবএক্সসেপশনটিকে পুনরায় ছুঁড়ে ফেলার পরিবর্তে একটি নতুন ব্যতিক্রম ছুঁড়েছিলেন। মূল ব্যতিক্রম স্ট্যাক সংরক্ষণ করতে (এবং আউটপুট) রাখতে চাইলে তার throw;পরিবর্তে ব্যবহার করুন throw new MyCustomException(...)
বিল

উত্তর:


178

আমি সাধারণত পাঠ্যের সম্পূর্ণ ব্যতিক্রম তথ্য (অভ্যন্তরীণ স্ট্যাক ট্রেস সহ) উপস্থাপন করতে ব্যতিক্রমগুলিতে .ToString () পদ্ধতিটি ব্যবহার করি:

catch (MyCustomException ex)
{
    Debug.WriteLine(ex.ToString());
}

নমুনা আউটপুট:

ConsoleApplication1.MyCustomException: some message .... ---> System.Exception: Oh noes!
   at ConsoleApplication1.SomeObject.OtherMethod() in C:\ConsoleApplication1\SomeObject.cs:line 24
   at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 14
   --- End of inner exception stack trace ---
   at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 18
   at ConsoleApplication1.Program.DoSomething() in C:\ConsoleApplication1\Program.cs:line 23
   at ConsoleApplication1.Program.Main(String[] args) in C:\ConsoleApplication1\Program.cs:line 13

খুব ভালো. আমি এটি করার সহজ উপায় খুঁজছিলাম এবং এটি এখানে। কিছুটা উদ্বেগের বিষয় হ'ল এটি আপনি যতটা স্পষ্ট ব্যবহার করেন ঠিক তেমন স্পষ্ট নয় St স্ট্যাকট্রেস অবজেক্ট (উদাহরণস্বরূপ)। আমি ভাবছি যদি এরকম আরও সুস্পষ্ট উপায় থাকে?
কোডে

4
কিছু সচেতন থাকুন যে কয়েকটি লাইব্রেরি ToStringপুরো তথ্যের পরিবর্তে পদ্ধতিটি ওভারটাইড করে এবং কাস্টম বার্তাগুলি মুদ্রণ করে (এটি একটি খারাপ কোডিং অনুশীলন, তাই কখনও তা করবেন না )
দিনই

@ পি ரதீப் আমি ToStringযখনই নিশ্চিত যে এটি ওভাররাইট করা হয়নি, এবং সরাসরি অন্যথায় ( অ্যান্ড্রু হারের উত্তর হিসাবে ) বৈশিষ্ট্যগুলি ব্যবহার করি use
দিনাই

53

এর মতো একটি ফাংশন ব্যবহার করুন:

    public static string FlattenException(Exception exception)
    {
        var stringBuilder = new StringBuilder();

        while (exception != null)
        {
            stringBuilder.AppendLine(exception.Message);
            stringBuilder.AppendLine(exception.StackTrace);

            exception = exception.InnerException;
        }

        return stringBuilder.ToString();
    }

তারপরে আপনি এটিকে কল করতে পারেন:

try
{
    // invoke code above
}
catch(MyCustomException we)
{
    Debug.Writeline(FlattenException(we));
}

15
বা আপনি ব্যবহার করতে পারেন ToString?
জাস্টিন

আমি টসস্ট্রিং ব্যবহার করছি এবং মনে হচ্ছে এটি ঠিক আছে। আমি যদি কেবলমাত্র সর্বনিম্ন অভ্যন্তরীণ ব্যতিক্রম (প্রকৃত কারণ সহ) বা অনুরূপ বাছাই করতে চাই তবে আমি অ্যান্ড্রুয়ের সমাধানটি সহ যাব :)
EEKay

এটি কেবলমাত্র টাস্ট্রিংয়ের চেয়ে আরও নমনীয়, কারণ আপনি কী স্ট্রিংয়ের মধ্যে যেতে পারেন তা চয়ন করতে পারেন। সম্ভবত আমি কেবল স্ট্যাকের ট্রেসগুলিতে আগ্রহী, প্রয়োজনীয় বার্তাগুলি নয়। অথবা আমি এটি তালিকা হিসাবে চাই <স্ট্রিং> একটি স্ট্রিং নয়।
জার শারদান

অভ্যন্তরীণ ব্যতিক্রমগুলি কী হবে?
ক্লার্ক

18

1. পদ্ধতি তৈরি করুন: আপনি যদি নিম্নলিখিত ক্রিয়ায় আপনার ব্যতিক্রমটি পাস করেন তবে এটি আপনাকে সমস্ত পদ্ধতি এবং বিশদ দেবে যা ব্যতিক্রমের কারণ।

public string GetAllFootprints(Exception x)
{
        var st = new StackTrace(x, true);
        var frames = st.GetFrames();
        var traceString = new StringBuilder();

        foreach (var frame in frames)
        {
            if (frame.GetFileLineNumber() < 1)
                continue;

            traceString.Append("File: " + frame.GetFileName());
            traceString.Append(", Method:" + frame.GetMethod().Name);
            traceString.Append(", LineNumber: " + frame.GetFileLineNumber());
            traceString.Append("  -->  ");
        }

        return traceString.ToString();
}

২. কল পদ্ধতি: আপনি এই পদ্ধতিতে কল করতে পারেন।

try
{
    // code part which you want to catch exception on it
}
catch(Exception ex)
{
    Debug.Writeline(GetAllFootprints(ex));
}

৩. ফলাফলটি পান:

File: c:\MyProject\Program.cs, Method:MyFunction, LineNumber: 29  -->  
File: c:\MyProject\Program.cs, Method:Main, LineNumber: 16  --> 

4
বেশ সহায়ক। আমি আপনার উদাহরণের ভিত্তিতে একটি এক্সটেনশন পদ্ধতি তৈরি করেছি । বিটিডাব্লু, বিপুল সংখ্যক পুনরাবৃত্তির ক্ষেত্রে আপনি আরও ভাল StringBuilderক্লাস ব্যবহার করতে চান ।
অ্যালেক্সমেলউ

4
অ্যান্ড্রেস লিঙ্কটি মারা গিয়েছিল। এটিই তার বাস্তবায়নের বর্তমান লিঙ্ক: github.com/AndreyWD/EasySharp/blob/master/NHelpers/…
ক্রিশ্চিয়ান জাঙ্ক

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