c #: তৃতীয় পক্ষের লাইব্রেরি থেকে চূড়ান্ত প্রতিযোগীতা কিভাবে পরিচালনা করবেন?

চূড়ান্তকরণকারীরা সর্বদা .net ফ্রেমওয়ার্ক দ্বারা আহ্বান করে, তাই ক্রমটি নিয়ন্ত্রণের বাইরে হতে পারে; এবং যদি কন্সট্রাকটর ব্যর্থ হয়, তবে ধ্বংসকারী এখনও চালু হতে পারে।

এর ফলে সমস্যার সৃষ্টি হতে পারে, যখন এই ধরনের চূড়ান্ত প্রতিযোগীতা তৃতীয় পক্ষের লাইব্রেরি থেকে আসে: আমি তাদের পরিচালনা করার উপায় খুঁজে পাই না!

উদাহরণস্বরূপ, নীচের কোডে, যদিও ক্লাস A এর কন্সট্রাক্টর সর্বদা একটি ব্যতিক্রম এবং ব্যর্থতা নিক্ষেপ করে, A এর চূড়ান্তকরণকারী .net ফ্রেমওয়ার্ক দ্বারা চালিত হবে, এছাড়াও ~ B- কে A এর B টাইপের সম্পত্তি বলে অভিহিত করা হয়।

class Program//my code
{
    static void Main(string[] args)
    {
        A objA;
        try
        {
            objA = new A();
        }
        catch (Exception)
        {
        }

        ;//when A() throws an exception, objA is null

        GC.Collect();//however, this can force ~A() and ~B() to be called.

        Console.ReadLine();
    }
}

public class A //3rd-party code
{
    public B objB;

    public A()
    {
        objB = new B();//this will lead ~B() to be called.
        throw new Exception("Exception in A()");
    }

    ~A()//called by .net framework
    {
        throw new Exception("Exception in ~A()");//bad coding but I can't modify
    } 
}

public class B//3rd-party code
{
    public B() { }

    ~B()//called by .net framework
    {
        throw new Exception("Exception in ~B()");//bad coding but I can't modify
    } 
}

যদি এটি আমার কোড হয়, এটি একটি বিট সহজ  - আমি চূড়ান্ত লক্ষ্যগুলিতে চেষ্টা-ধরা ব্যবহার করতে পারি, অন্তত আমি কিছু লগিং করতে পারি  - আমি প্রোগ্রামটি ক্র্যাশের ব্যতিক্রম করতে অনুমতি দিতে পারি, ত্রুটি ASAP আবিষ্কার করতে পারি  - অথবা যদি আমি ব্যতিক্রমটি "সহ্য" করতে চাই, তবে ব্যতিক্রমটি দমন করার জন্য আমি একটি চেষ্টা-ধরা থাকতে পারে, এবং একটি সুন্দর প্রদর্শনী থাকতে পারে।

কিন্তু যদি একটি এবং বি তৃতীয় পক্ষের লাইব্রেরি থেকে ক্লাস হয়, আমি কিছুই করতে পারি না! আমি ঘটতে ব্যতিক্রম নিয়ন্ত্রণ করতে পারে না, আমি তাদের ধরা না পারে, তাই আমি এটা লগ ইন বা এটি দমন করা যাবে না!

আমি কি করতে পারি?

9
^^ - গ্রেট পয়েন্ট। একটি প্রকৃত উত্তর হতে হবে।
যোগ লেখক Ritch Melton, উৎস
+1 আকর্ষণীয় সমস্যা (এবং সেই সময়, একটি এবং B ) সরবরাহকারী লাইব্রেরির বিক্রেতাদের সাথে একটি জরুরী বাগ রিপোর্ট উত্থাপন করুন।
যোগ লেখক Ergwun, উৎস

3 উত্তর

থার্ড পার্টি ইউটিলিটি মত ধ্বনি খারাপ লেখা হয়। :)

আপনি কি AppDomain.UnhandledException ব্যবহার করে এটি ধরার চেষ্টা করেছেন?

2
যোগ
হ্যাঁ, এখন আমি এটা করছি। এটা লগিং করতে পারে, কিন্তু ... অনুগ্রহ করে প্রস্থান না করতে পারেন ...
যোগ লেখক athos, উৎস

আপনি GC.SuppressFinalizer (objA) এবং < একটি href = "http://msdn.microsoft.com/en-us/library/system.gc.keepalive%28v=VS.100%29.aspx" rel = "nofollow"> জি.সি.ক্যাপআলভে (objA) </একটি> যা আবর্জনা সংগ্রাহককে সেই অবজেক্টের চূড়ান্তভাবে কল করতে বাধা দেবে এবং তাই KeepAlive ব্যবহার করার সময় objB চূড়ান্ত হবে না কারণ objA " যা জীবিত "এখনও এর রেফারেন্স আছে তবে আপনি যদি মেমরির লিক থেকে সচেতন হন তবে আপনি সঠিকভাবে objA কে চূড়ান্ত বা নিষ্পত্তি করতে ভুলবেন না।

কিন্তু অনুমান করা যায় যে objA একটি পদ্ধতিতে কিছু সময়ে এটিকে আরেকটি objectB আরম্ভ করে এবং এটি সঠিকভাবে নিষ্পত্তি না করে, তবে দুর্ভাগ্যবশত আমি কিছুই করি না এটা সম্পর্কে

আরেকটি বিষয় যা আপনি চেষ্টা করতে পারেন তা হল চেক করার জন্য যে আপনি যখন রিলিজ </কোড> মোড পরিবর্তে ডিবাগ </কোড> মোডে থাকেন তখন লাইব্রেরি ভিন্নভাবে আচরণ করে; উদাহরণস্বরূপ, যদি তারা ডিবাগ মোডে "ফাঁস হয়ে যায় তবে তারা ডেভেলপারদের সাহায্যকারীর মত" যদি তারা কোনও বস্তুকে সঠিকভাবে নামাতে বা চূড়ান্তভাবে কল না করে তবে ডিবাগ করার সময় একটি ব্যতিক্রম হবে "।

~A()
{
#if DEBUG
    throw new Exception("Exception in ~A()");
#endif//DEBUG
} 

যদি এমন হয় না, তাহলে আমার মনে হয় আপনি সেই লাইব্রেরির সাথে খারাপ দিন কাটাবেন।

0
যোগ
দুঃখিত জর্দান, আমি মনে করি আমি আমার প্রশ্ন স্পষ্টভাবে না করা, যাতে আপনি এটি একটি ভুল ধারণা থাকতে পারে।
যোগ লেখক athos, উৎস
@ আথোস: দুঃখিত, আমি আবার আপনার প্রশ্নটি পড়েছি এবং মনে করেছি যে আমি objA নাল!
যোগ লেখক Jalal Said, উৎস

আপনি আপনার অ্যাপ্লিকেশনের জন্য একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার বিবেচনা করতে চাইতে পারেন। আপনি যদি আপনার ASP.NET, WinForm, MVC, ইত্যাদি করছেন তা নির্দেশ করে নি, তবে এখানে একটি কনসোল প্রয়োগের জন্য:

কনসোল অ্যাপ্লিকেশনে। NET গ্লোবাল ব্যতিক্রম হ্যান্ডলার

ASP.NET- এ, আপনি অসম্পূর্ণ ব্যতিক্রমগুলি ধরতে Global.asax ফাইল ব্যবহার করতে পারেন।

আপনি যদি সবসময় আপনার অ্যাপ্লিকেশনে GC.Collect() ডাকেন, তাহলে আপনি একটি চেষ্টা-আটকে থাকা ব্লক হিসাবেও মোড়কে চেষ্টা করতে পারেন।

শুধু কিছু ধারণা বিবেচনা করা।

0
যোগ