প্রকৃতপক্ষে, কিছু পরিস্থিতি রয়েছে যা throw
স্ট্যাচট্রেস স্ট্যাকট্রেস তথ্য সংরক্ষণ করে না। উদাহরণস্বরূপ, নীচের কোডে:
try
{
int i = 0;
int j = 12 / i; // Line 47
int k = j + 1;
}
catch
{
// do something
// ...
throw; // Line 54
}
স্ট্যাকট্রেস নির্দেশ করবে যে লাইন 54 ব্যতিক্রম করেছে, যদিও এটি 47 লাইনে উত্থাপিত হয়েছিল।
Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.
at Program.WithThrowIncomplete() in Program.cs:line 54
at Program.Main(String[] args) in Program.cs:line 106
উপরের বর্ণিতটির মতো পরিস্থিতিতে, মূল স্ট্যাকট্রেসকে উপস্থাপন করার জন্য দুটি বিকল্প রয়েছে:
ব্যতিক্রম কল করা হচ্ছে I অভ্যন্তরীণ সংরক্ষণের স্ট্যাকট্রেস
এটি একটি বেসরকারী পদ্ধতি হওয়ায় এটি প্রতিবিম্ব ব্যবহার করে আহ্বান জানাতে হবে:
private static void PreserveStackTrace(Exception exception)
{
MethodInfo preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace",
BindingFlags.Instance | BindingFlags.NonPublic);
preserveStackTrace.Invoke(exception, null);
}
স্ট্যাকট্রেস তথ্য সংরক্ষণের জন্য আমার ব্যক্তিগত পদ্ধতির উপর নির্ভর করার একটি অসুবিধা রয়েছে। এটি নেট ফ্রেমওয়ার্কের ভবিষ্যতের সংস্করণগুলিতে পরিবর্তন করা যেতে পারে। উপরের কোড উদাহরণ এবং নীচের প্রস্তাবিত সমাধানটি ফ্যাব্রিস মার্গুইরি ওয়েব্লগ থেকে বের করা হয়েছিল ।
কল করা ব্যতিক্রম Sসেটঅজেক্টডাটা
নীচের কৌশলটি আন্তঃ টিখি দ্বারা ইন সি # এর জবাব হিসাবে প্রস্তাব করেছিলেন , স্ট্যাক ট্রেস প্রশ্নটি না হারিয়ে আমি কীভাবে অভ্যন্তরীণ ধারণাটি পুনর্বার করতে পারি ।
static void PreserveStackTrace (Exception e)
{
var ctx = new StreamingContext (StreamingContextStates.CrossAppDomain) ;
var mgr = new ObjectManager (null, ctx) ;
var si = new SerializationInfo (e.GetType (), new FormatterConverter ()) ;
e.GetObjectData (si, ctx) ;
mgr.RegisterObject (e, 1, si) ; // prepare for SetObjectData
mgr.DoFixups () ; // ObjectManager calls SetObjectData
// voila, e is unmodified save for _remoteStackTraceString
}
যদিও, এটি পাবলিক পদ্ধতিতে নির্ভর করার সুবিধা রয়েছে কেবল এটি নিম্নলিখিত ব্যতিক্রমী নির্মাণকারীর উপরও নির্ভর করে (যা তৃতীয় পক্ষ দ্বারা বিকশিত কিছু ব্যতিক্রম বাস্তবায়ন করে না):
protected Exception(
SerializationInfo info,
StreamingContext context
)
আমার পরিস্থিতিতে আমাকে প্রথম পন্থাটি বেছে নিতে হয়েছিল, কারণ তৃতীয় পক্ষের লাইব্রেরি দ্বারা যে ব্যতিক্রমগুলি আমি ব্যবহার করছিলাম সেগুলি এই নির্মাণকারীর প্রয়োগ করে নি।