পিএইচপি ত্রুটি হ্যান্ডলিং: মারা () বনাম ট্রিগার_অরার () বনাম থ্রো ব্যতিক্রম


118

পিএইচপি-তে ত্রুটি পরিচালনা করার ক্ষেত্রে - এ পর্যন্ত আমি জানি 3 টি শৈলী রয়েছে:

  1. die()বা exit()শৈলী:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
  2. throw Exception শৈলী:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
  3. trigger_error() শৈলী:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }

এখন, পিএইচপি ম্যানুয়ালটিতে তিনটি পদ্ধতি ব্যবহৃত হয়।

  • আমি যা জানতে চাই তা হল আমার কোন স্টাইলটি পছন্দ করা উচিত এবং কেন?

  • এগুলি কি একে অপরের প্রতিস্থাপনের জন্য 3 টি ড্রপ এবং তাই একে অন্যকে পরিবর্তিতভাবে ব্যবহার করা যেতে পারে?

সামান্য সম: এটা কি শুধু আমারই বা সবাই মনে করে পিএইচপি ত্রুটি পরিচালনা বিকল্পগুলি এখন আগের হয় অনেকগুলি ব্যাপ্তি এটা পিএইচপি ডেভেলপার বিভ্রান্ত কিভাবে?


4
এগুলি "শৈলী" নয়। এগুলি বিভিন্ন ভাষার বৈশিষ্ট্য। বিভিন্ন উদ্দেশ্যে।
মারিও

11
@ মারিও: বিভিন্ন ইন্ডেন্টেড উদ্দেশ্য কী? দয়া করে আমাকে আলোকিত করুন :)
কৌতূহলী মন

আপনি প্রশ্নটি দুর্দান্ত উপায়ে রেখেছেন। জিজ্ঞাসা করার জন্য ধন্যবাদ
অ্যাকাউন্টেন্ট

উত্তর:


85

প্রথমটি কখনই উত্পাদন কোডে ব্যবহার করা উচিত নয়, যেহেতু এটি শেষ ব্যবহারকারীদের কাছে অপ্রাসঙ্গিক তথ্য পরিবহন করে (কোনও ব্যবহারকারী "ডাটাবেসে সংযুক্ত হতে পারে না" ) সম্পর্কে কিছুই করতে পারে না

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

trigger_error()আপনাকে সূক্ষ্ম শস্য ত্রুটির প্রতিবেদন করতে দেয় (বিভিন্ন স্তরের ত্রুটি বার্তাগুলি ব্যবহার করে) এবং আপনি এই ত্রুটিগুলি শেষ ব্যবহারকারীদের (ব্যবহার করে set_error_handler()) থেকে আড়াল করতে পারেন তবে এখনও পরীক্ষার সময় এগুলি আপনার কাছে প্রদর্শিত হতে পারে।

এছাড়াও trigger_error()উন্নয়ন যে একটি কাস্টম ত্রুটি হ্যান্ডলার ব্যবহার প্রকাশনা কোডে দমন করা যাবে সময় গুরুত্বপূর্ণ অ মারাত্মক বার্তা উত্পন্ন করতে পারে। আপনি মারাত্মক ত্রুটিও তৈরি করতে পারেন ( E_USER_ERROR) তবে সেগুলি পুনরুদ্ধারযোগ্য নয়। আপনি যদি সেগুলির মধ্যে একটি ট্রিগার করেন তবে প্রোগ্রামের সম্পাদনা সেই মুহুর্তে থামবে । এই কারণেই মারাত্মক ত্রুটির জন্য ব্যতিক্রমগুলি ব্যবহার করা উচিত। এইভাবে, আপনার প্রোগ্রামের প্রবাহের উপর আপনার আরও নিয়ন্ত্রণ থাকবে:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

এখানে, যদি gather_data()কেবল প্লেইন কুটিল (ব্যবহার E_USER_ERRORবা ব্যবহারের die()) সুযোগ থাকে তবে পূর্বের INSERTবিবৃতিগুলি এটি আপনার ডাটাবেসে তৈরি করে দিত, এমনকি যদি না ইচ্ছা হয় এবং পরবর্তী কি ঘটতে পারে তবে আপনার নিয়ন্ত্রণ নেই।


2
তাই বাইরে trigger_error()& ব্যতিক্রম নিক্ষেপ: এক আমি ব্যবহার করা উচিত যা & কখন?
কৌতুহলী মন

@ গৌরিশ এতে যুক্ত হওয়া উদাহরণটি দেখুন।
লিনাস ক্লিন

2
আপনার উদাহরণ পড়ার পরে, আমার মনে হয় এখন আমি নিক্ষেপ ব্যতিক্রমের উদ্দেশ্যটি আরও ভালভাবে বুঝতে পারি। ধন্যবাদ :)
কৌতূহলী মন

1
@ পেসারিয়ার যা সার্ভারের কনফিগারেশনের উপর নির্ভর করে। কোনও সিস্টেম প্রতি ডিফল্ট স্বতঃপাদন করতে কনফিগার করা যেতে পারে , তাই স্পষ্ট । এই সিউডো কোড উদাহরণটি উভয় কেসকে কভার করে: সার্ভারগুলি যা স্বায়ত্তশাসনের জন্য কনফিগার করা হয়নি ( বিবৃতিটি প্রয়োজনীয়) এবং সেগুলি করে। ROLLBACKCOMMIT
লিনাস ক্লিন

1
@ লিনুসকলিন, আমরা লাইনটি চালানোর পরে অটোকম্যাটটি বন্ধ হয় না query('START TRANSACTION');?
পেসারিয়ার

10

আমি সাধারণত উন্নয়ন কোডে সাধারণ ডিবাগিংয়ের জন্য প্রথম উপায় ব্যবহার করি। এটি উত্পাদন জন্য প্রস্তাবিত হয় না। সর্বোত্তম উপায় হ'ল একটি ব্যতিক্রম ছুঁড়ে ফেলা, যা আপনি প্রোগ্রামের অন্যান্য অংশে ধরতে পারেন এবং পরিচালনা করতে কিছু ত্রুটি করতে পারেন।

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


1
ব্যতিক্রম নিক্ষেপ করা হলেও ধরা না পড়লে কী ঘটে? আমার ধারণা, এটি মারাত্মক ত্রুটি ঘটবে। এবং trigger_error()একই জিনিস ঘটে। তাহলে পার্থক্য কি?
কৌতূহলীমাংশ

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