ডুপ্লিকেট ত্রুটি হ্যান্ডলিং কোড C # মধ্যে কমান?

আপগ্রেড হ্যান্ডলিং কাজের সাথে আমি সম্পূর্ণ সুখী ছিলাম না, টেবিলে (স্ট্যাক অনুলিপি, ইত্যাদি) অনেক ব্যতিক্রম এবং চেষ্টা / ধরা আছে, কিন্তু প্রক্রিয়াটিতে OO মডেলের অনেকগুলি ভাঙ্গা মনে হচ্ছে।

যাইহোক, এখানে সমস্যা আছে:

আসুন আমরা বলতে পারি যে আপনার কিছু ক্লাস আছে যা নেটওয়ার্কে ফাইল IO অপারেশনগুলিকে আবদ্ধ করে বা অন্তর্ভুক্ত করে (উদাহরণস্বরূপ কিছু ফাইলের কিছু বিশেষ ইউএনসি পাথে পড়া এবং লেখা)। বিভিন্ন কারণে আপনি যে IO অপারেশন ব্যর্থ করতে চান না, তাই যদি আপনি সনাক্ত করেন যে তারা ব্যর্থ আপনি তাদের পুনরায় চেষ্টা এবং আপনি তাদের পুনরায় চেষ্টা করা পর্যন্ত তারা সফল বা আপনি একটি সময়সীমা পৌঁছানোর। আমি ইতিমধ্যে একটি সুবিধাজনক RetryTimer বর্গ আছে যা আমি অন্তর্বর্তীকালীন এবং retries মধ্যে বর্তমান থ্রেড ঘুমাতে এবং সময়কাল সময় শেষ হয়েছে নির্ধারণ করতে ব্যবহার করতে পারেন, ইত্যাদি।

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

এখানে একটি উদাহরণ কোড স্নিপেট:

RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
bool success = false;
while (!success)
{
    try
    {
        // do some file IO which may succeed or fail
        success = true;
    }
    catch (IOException e)
    {
        if (fileIORetryTimer.HasExceededRetryTimeout)
        {
            throw e;
        }
        fileIORetryTimer.SleepUntilNextRetry();
    }
}

সুতরাং, কিভাবে আপনি এই ফাইলের অধিকাংশ প্রতিলিপি এড়ানোর জন্য প্রতি ফাইল IO অপারেশন সারা ক্লাস? আমার সমাধান ছিল বেনামী প্রতিনিধি ব্লক এবং ক্লাসে একক পদ্ধতি যা এটিতে প্রেরিত প্রতিনিধি ব্লকটি চালানো হয়েছিল। এটি আমাকে অন্যান্য পদ্ধতিতে এগুলি করার অনুমতি দিয়েছে:

this.RetryFileIO( delegate()
    {
        // some code block
    } );

আমি এই কিছুটা ভালো লেগেছে, কিন্তু এটি পছন্দসই একটি অনেক পাতা আমি শুনতে চাই কিভাবে অন্য মানুষ এই ধরণের সমস্যার সমাধান করবে।

0
যোগ লেখক Dan Tao, উৎস

4 উত্তর

শুধু আশ্চর্য, আপনি আপনার পদ্ধতি অনুভব করা যাবে না মনে করেন কি? আপনি নাম দিয়ে একটি নামহীন প্রতিনিধি প্রতিস্থাপন করতে পারেন .. নামে? প্রতিনিধি, কিছু ভালো কিছু

    public delegate void IoOperation(params string[] parameters);

    public void FileDeleteOperation(params string[] fileName)
    {
        File.Delete(fileName[0]);
    }

    public void FileCopyOperation(params string[] fileNames)
    {
        File.Copy(fileNames[0], fileNames[1]);
    }

    public void RetryFileIO(IoOperation operation, params string[] parameters)
    {
        RetryTimer fileIORetryTimer = new RetryTimer(TimeSpan.FromHours(10));
        bool success = false;
        while (!success)
        {
            try
            {
                operation(parameters);
                success = true;
            }
            catch (IOException e)
            {
                if (fileIORetryTimer.HasExceededRetryTimeout)
                {
                    throw;
                }
                fileIORetryTimer.SleepUntilNextRetry();
            }
        }
    }

    public void Foo()
    {
        this.RetryFileIO(FileDeleteOperation, "L:\file.to.delete" );
        this.RetryFileIO(FileCopyOperation, "L:\file.to.copy.source", "L:\file.to.copy.destination" );
    }
0
যোগ

আপনি আরো একটি OO পদ্ধতি ব্যবহার করতে পারে:

  • একটি বেস ক্লাস তৈরি করুন যা ত্রুটি পরিচালনা করে এবং কংক্রিটের কাজ সম্পাদন করার জন্য একটি বিমূর্ত পদ্ধতি কল করে। (টেমপ্লেট পদ্ধতি প্যাটার্ন)
  • প্রতিটি অপারেশন জন্য কংক্রিট ক্লাস তৈরি করুন।

এটি আপনাকে সঞ্চালন প্রতিটি ধরনের অপারেশন নামকরণ সুবিধা এবং একটি আদেশ প্যাটার্ন দেয় - অপারেশন অবজেক্ট হিসাবে প্রতিনিধিত্ব করা হয়েছে।

0
যোগ

এখানে আমি সম্প্রতি কি কি। এটা সম্ভবত অন্য জায়গায় আরও ভাল করা হয়েছে, কিন্তু এটি বেশ পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য বলে মনে হচ্ছে।

আমার কাছে এমন একটি ইউটিলিটি পদ্ধতি আছে যা এই রকম দেখায়:

    public delegate void WorkMethod();

    static public void DoAndRetry(WorkMethod wm, int maxRetries)
    {
        int curRetries = 0;
        do
        {
            try
            {
                wm.Invoke();
                return;
            }
            catch (Exception e)
            {
                curRetries++;
                if (curRetries > maxRetries)
                {
                    throw new Exception("Maximum retries reached", e);
                }
            }
        } while (true);
    }

তারপর আমার অ্যাপ্লিকেশনে, আমি জিনিস পরিষ্কার রাখতে C# এর Lamda এক্সপ্রেশন সিনট্যাক্স ব্যবহার করি:

Utility.DoAndRetry(() => ie.GoTo(url), 5);

এই আমার পদ্ধতি কল এবং 5 বার আপ retries। পঞ্চম প্রচেষ্টাতে, মূল আপত্তিটি পুনরায় আপ করার ব্যতিক্রমের ভিতরে পুনর্বিন্যাস করা হয়।

0
যোগ
কিন্তু কাস্টম WorkMethod এর পরিবর্তে অ্যাকশন এর পরিবর্তে?
যোগ লেখক Dan Tao, উৎস