"ধরা" না দিয়ে "চেষ্টা-অবশেষে" করার অর্থ কি?


127

আমি এর মতো কিছু কোড দেখেছি:

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

আমি ভাবলাম tryএকটা আছে catch?

কেন এই কোডটি এভাবে করে?


1
এটি উল্লিখিত অন্যান্য প্রতিক্রিয়া হিসাবে পরিষ্কার করা নিশ্চিত করে, বিশেষত ফাইল হ্যান্ডলগুলি fopenবা ডিবি সংযোগের জন্য (পিএইচপি
তেও

উত্তর:


182

সম্পদগুলি যথাযথভাবে পরিষ্কার করার অনুমতি দেওয়ার জন্য আপনি যদি বর্তমানে সম্পাদনকারী পদ্ধতিটিকে ব্যতিক্রম করতে চান তবে এটি কার্যকর। কলিং পদ্ধতি থেকে ব্যতিক্রমটি পরিচালনা করার নীচে একটি নিবিড় উদাহরণ দেওয়া আছে।

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}

17
লক সহ সাধারণত ব্যবহৃত হিসাবে: লক.লক (); চেষ্টা করুন {/ * লকড * / try অবশেষে। লক.আনলক () try
মিনিট

অবশেষে যদি কোনও ব্যতিক্রম ভিতরে ফেলে দেওয়া হয় তবে কী হবে?
বার্থ

1
@ বার্থ যখন কোনও catchব্লক নেই সেখানে প্রবেশ করা ব্যতিক্রমটিকে ব্লকটিতে finallyকোনও ব্যতিক্রমের আগে কার্যকর করা হবে try। সুতরাং যদি দুটি ব্যতিক্রম হয় tryএবং একটি finallyব্যতিক্রম কেবল ছুঁড়ে দেওয়া হয় তবে তা হ'ল finally। এই আচরণ উভয় ব্যতিক্রম এই ভাষায় একই সময়ে ফেলে দেওয়া হবে এবং ব্যতিক্রমগুলি অর্ডার পিএইচপি এবং পাইথন মধ্যে একই নয় tryপ্রথমে একটি তারপর finally
বৃষ্টি

72

এটি সেখানে রয়েছে কারণ প্রোগ্রামারটি নিশ্চিত করতে চেয়েছিল যে db.cleanup()চেষ্টা করা ব্লকের কোডটি একটি ব্যতিক্রম ছুঁড়ে মারলেও তাকে ডাকা হয়। কোনওরকম ব্যতিক্রম block ব্লক দ্বারা পরিচালিত হবে না, তবে শেষ অবধি কার্যকর করার পরে সেগুলি কেবল উপরের দিকে প্রচার করা হবে।


23
+1 একদম ঠিক। tryঠিক আছে মঞ্জুরি দেওয়ার জন্য finally। ব্যতিক্রম ধরা পড়ে না।
জকম্যান

2
স্পষ্ট করে দেওয়ার জন্য +1 ব্যতীত স্ট্যাকটি ধরে না যাওয়া অব্যাহত থাকে। ধন্যবাদ
কোড জকি

20

কেন এই কোডটি এভাবে করে?

কারণ আপাতদৃষ্টিতে কোডটি এই স্তরে ব্যতিক্রমগুলি পরিচালনা করতে জানে না। এটি ঠিক আছে - যতক্ষণ না একজন কল করেন, ততক্ষণ যতক্ষণ ব্যতিক্রম চূড়ান্তভাবে কোনও জায়গায় পরিচালিত হয়।

প্রায়শই, নিম্ন-স্তরের কোড ব্যতিক্রমগুলিতে যথাযথ প্রতিক্রিয়া জানাতে পারে না কারণ ব্যবহারকারীকে অবহিত করা দরকার, বা ব্যতিক্রমটি লগ ইন করতে হবে, অথবা অন্য কোনও কৌশল চেষ্টা করতে হবে। নিম্ন-স্তরের কোডটি কেবল একটি ফাংশন সম্পাদন করে এবং উচ্চ-স্তরের সিদ্ধান্ত গ্রহণ সম্পর্কে জানেন না।

তবে কোডটির এখনও তার সংস্থানগুলি পরিষ্কার করতে হবে (কারণ এটি যদি না হয় তবে তারা ফাঁস হবে), সুতরাং এটি ক্লজটিতে ঠিক এমনটি করে, এটি finallyনিশ্চিত করে তোলে যে এটি সর্বদা ঘটে থাকে, ব্যতিক্রম ছুঁড়েছিল কিনা।


2

অবশেষে ব্লকটি নিশ্চিত করে যে কোনও রানটাইম এক্সেপশন নিক্ষেপ করা হলেও (সম্ভবত কল কোডটিতে কিছু ত্রুটির কারণে), db.cleanup()কল করা হবে।

এটি প্রায়শই খুব বেশি বাসা বাঁধতে ব্যবহার করা হয়:

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

বিশেষত যখন অনেকগুলি পয়েন্ট রয়েছে যেখানে পদ্ধতিটি ফিরে আসে, এটি পাঠযোগ্যতার উন্নতি করে যেহেতু যে কোনও ক্লিন আপ কোড দেখতে পাবে প্রতিটি ক্ষেত্রেই ডাকা হয়।


0

ডাটাবেস বন্ধ রয়েছে তা নিশ্চিত করার জন্য কোডটি এটি করছে।
সাধারণত, আপনি যেভাবে করবেন তা হ'ল আপনার সমস্ত ডাটাবেস অ্যাক্সেসিং কোডটি চেষ্টা ব্লকে রেখে, এবং তারপরে অবশেষে ব্লকে ডাটাবেস বন্ধ করার জন্য একটি কল দেওয়া put
যেভাবে চেষ্টা করুন ... অবশেষে কাজ করে, তার মানে ট্রাই ব্লকের কোডটি চালিত হয় এবং শেষ অবধি কোডটি শেষ হয়ে গেলে চালানো হয় ... যাই হোক না কেন।
কম্পিউটারটি সংক্ষিপ্তভাবে প্রাচীর থেকে ইয়াঙ্ক করা হচ্ছে, শেষ অবধি কার্যকর করা হবে।
এর অর্থ হ'ল এমনকি যদি কোনও ব্যতিক্রম বলা হয়, এবং পদ্ধতিটি কার্যকর করতে তিন বছর সময় লাগে, এটি এখনও অবশেষে ব্লকে চলে যাবে এবং ডাটাবেসটি বন্ধ হয়ে যাবে।


0

ট্রাই ব্লকের কোডগুলির মধ্যে যদি কোনও চেক করা ব্যতিক্রম ছুঁড়ে ফেলতে পারে তবে তা পদ্ধতি স্বাক্ষরের থ্রোস ক্লোজে উপস্থিত থাকতে হবে। যদি একটি চেক না করা ব্যতিক্রম ছুঁড়ে ফেলা হয়, তবে এটি পদ্ধতিটি ছাড়িয়ে যাবে।

শেষ পর্যন্ত ব্লকটি সর্বদা কার্যকর করা হয়, ব্যতিক্রম ছুঁড়ে ফেলা হোক বা না হোক।

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