অন্যান্য উত্তরগুলি সম্পূর্ণ সঠিক, তবে এই উত্তরটি কিছু অতিরিক্ত ডেটালিস সরবরাহ করে, আমার ধারণা।
এই উদাহরণ বিবেচনা করুন:
using System;
static class Program {
static void Main() {
try {
ThrowTest();
} catch (Exception e) {
Console.WriteLine("Your stack trace:");
Console.WriteLine(e.StackTrace);
Console.WriteLine();
if (e.InnerException == null) {
Console.WriteLine("No inner exception.");
} else {
Console.WriteLine("Stack trace of your inner exception:");
Console.WriteLine(e.InnerException.StackTrace);
}
}
}
static void ThrowTest() {
decimal a = 1m;
decimal b = 0m;
try {
Mult(a, b); // line 34
Div(a, b); // line 35
Mult(b, a); // line 36
Div(b, a); // line 37
} catch (ArithmeticException arithExc) {
Console.WriteLine("Handling a {0}.", arithExc.GetType().Name);
// uncomment EITHER
//throw arithExc;
// OR
//throw;
// OR
//throw new Exception("We handled and wrapped your exception", arithExc);
}
}
static void Mult(decimal x, decimal y) {
decimal.Multiply(x, y);
}
static void Div(decimal x, decimal y) {
decimal.Divide(x, y);
}
}
আপনি যদি throw arithExc;
লাইনটি আপত্তিহীন করেন তবে আপনার আউটপুটটি হ'ল:
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 44
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
অবশ্যই, যেখানে ব্যতিক্রম ঘটেছিল সে সম্পর্কে আপনি তথ্য হারিয়েছেন। পরিবর্তে আপনি যদি throw;
লাইনটি ব্যবহার করেন তবে এটি যা পাবেন:
Handling a DivideByZeroException.
Your stack trace:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 46
at Program.Main() in c:\somepath\Program.cs:line 9
No inner exception.
এটি অনেক ভাল, কারণ এখন আপনি দেখতে পাচ্ছেন যে এটি সেই Program.Div
পদ্ধতি যা আপনাকে সমস্যার কারণ করেছিল। তবে সমস্যাটি try
ব্লকের 35 লাইন বা লাইন 37 থেকে আসে কিনা তা দেখতে এখনও শক্ত ।
যদি আপনি তৃতীয় বিকল্প ব্যবহার করেন তবে বাহ্যিক ব্যতিক্রম মোড়ানো, আপনি কোনও তথ্য হারাবেন না:
Handling a DivideByZeroException.
Your stack trace:
at Program.ThrowTest() in c:\somepath\Program.cs:line 48
at Program.Main() in c:\somepath\Program.cs:line 9
Stack trace of your inner exception:
at System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
at System.Decimal.Divide(Decimal d1, Decimal d2)
at Program.Div(Decimal x, Decimal y) in c:\somepath\Program.cs:line 58
at Program.ThrowTest() in c:\somepath\Program.cs:line 35
বিশেষত আপনি দেখতে পারেন যে এটি 35 লাইন যা সমস্যার দিকে পরিচালিত করে। তবে এর জন্য লোকেরা অনুসন্ধান করতে InnerException
হবে এবং সাধারণ ক্ষেত্রে অভ্যন্তরীণ ব্যতিক্রমগুলি ব্যবহার করতে কিছুটা অপ্রত্যক্ষ মনে হয়।
ইন এই ব্লগ পোস্টে তারা কলিং (প্রতিফলন মাধ্যমে) করে সীমারেখা নম্বর (চেষ্টা ব্লক লাইন) সংরক্ষণ internal
intance পদ্ধতি InternalPreserveStackTrace()
উপর Exception
বস্তু। তবে এর মতো প্রতিবিম্বটি ব্যবহার করা ভাল নয় (। নেট ফ্রেমওয়ার্ক internal
কোনও দিন সতর্কতা ছাড়াই তাদের সদস্যদের পরিবর্তন করতে পারে )।